mockMvc构建web单元测试学习笔记

web应用本来需要依靠tomcat这个环境运行

现在用mockMvc是为了模拟这个web环境,简化测试

什么是mock(模拟)

模拟对象---mock object是以可控方式模拟真实对象行为的假对象,通过模拟输入数据,验证程序达到预期结果

为什么使用mock对象

因为真实对象过于复杂,无法在单元测试中使用,故采用模拟对象替代

如网络延迟,不可能在单元测试中直接搭建一个服务器,只需要mock模拟出场景就行

mockMvc

spring-test包提供,能够实现对于http请求的模拟,直接使用网络的形式,转换到Controller的调用,使得测试速度快,不依赖网络环境,同时提供了一套的验证工具

XML 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

mockMvc对象能够和Junit5来mock模拟出来tomcat运行环境,帮助自动测试出来接口

例子1:日志输出测试

类中方法:

java 复制代码
@RequestMapping(value = "/logger",method = RequestMethod.GET)
    @ResponseBody
    public String testLogger() {
        Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.debug("测试级别日志");
        return "SUCCESS";
    }

测试代码:

java 复制代码
@Resource
    private MockMvc mockMvc;
    @Test
    @DisplayName("加油站-自己重定义测试方法名")
    public void testMock1() throws Exception {
        //自动向/logger发起一个get请求->
        mockMvc.perform(MockMvcRequestBuilders.get("/logger"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.content().string("SUCCESS"))
                .andReturn();
    }

启动test,下面控制台显示的和实际上启动web应用是一致的,这个就是mock的模拟过程

实现:

端口号是随机的 ,原因是在注解@SpringBootTest上设置了

复制代码
webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT(每次都是随机端口,防止端口占用)

控制台显示了请求和响应的详细信息,就像在浏览器的检查网络页面显示的一样

请求信息:

辅助描述信息:

响应:

若在测试类中新增一句预期为SUCCESS1,如下图与实际结果不符,测试就会爆红,并说明预期值和实际值各为多少

@DispayName注解可用于重新定义方法名

例子2:JSON响应测试用例

类中方法:

java 复制代码
 @RequestMapping(value = "/get_header",method = RequestMethod.GET)
    @ResponseBody
    public Map getHeader(@RequestHeader("token") String accessToken,String id){
        Map<String,Object> params=new HashMap<>();//返回的是Map映射对象,里面是json格式的
        params.put("access_token",accessToken);
        params.put("id",id);
        return params;
    }

测试代码:

java 复制代码
@Test
    @DisplayName("json响应测试用例")
    public void testMock2() throws Exception {
        //请求头设置,还有请求参数的设置
        mockMvc.perform(MockMvcRequestBuilders.get("/get_header")
                //设置请求头中access_token的信息
                .header("token","assssdq")
                //设置传入的参数id的值
                .param("id","891113"))
                //是否符合预期的响应isOK
                .andExpect(MockMvcResultMatchers.status().isOk())
                //响应的请求头的值是否和设置的请求头内的数据相等
                .andExpect(MockMvcResultMatchers.jsonPath("access_token").value("assssdq"))
                //将完整的响应过程,从请求到响应的各个参数的值都返回输出在控制台上
                .andDo(MockMvcResultHandlers.print())
                //结束请求并获得处理结果
                .andReturn();
    }

测试结果:

相关推荐
databook10 小时前
【总结整理】软件测试的反模式
单元测试·测试
l***21781 天前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j
川石课堂软件测试2 天前
Android和iOS APP平台测试的区别
android·数据库·ios·oracle·单元测试·测试用例·cocoa
大熊猫侯佩2 天前
Swift 6.2 列传(第十七篇):钟灵的“雷电蟒”与测试附件
单元测试·swift·apple
卓码软件测评2 天前
软件首版次认定测试机构:【Apifox与UMI框架结合:实现OpenAPI规范与Mock服务的自动化流水线】
测试工具·ci/cd·性能优化·单元测试·测试用例
虫小宝3 天前
企业微信API接口对接中Java后端的模拟测试(Mock)与单元测试实战技巧
java·单元测试·企业微信
黄金贼贼3 天前
2026最新java单元测试json校验器
java·单元测试·json
帅次3 天前
从开发到部署:软件实现、测试与交付全流程核心技术解析
功能测试·单元测试·测试用例·集成测试·压力测试·模块测试·安全性测试
叶落无痕526 天前
Electron应用自动化测试实例
前端·javascript·功能测试·测试工具·electron·单元测试
汽车仪器仪表相关领域6 天前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试