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();
    }

测试结果:

相关推荐
啃火龙果的兔子21 小时前
前端单元测试覆盖率工具有哪些,分别有什么优缺点
前端·单元测试
编程乐学(Arfan开发工程师)11 天前
75、单元测试-嵌套测试
前端·javascript·redis·python·单元测试·bootstrap
编程乐学(Arfan开发工程师)11 天前
73、单元测试-断言机制
服务器·数据库·servlet·单元测试·sqlite·log4j·mybatis
编程乐学(Arfan开发工程师)11 天前
74、单元测试-前置条件
redis·python·阿里云·单元测试·云计算·bootstrap
不一样的少年_11 天前
前端单元测试的救星:Vitest 输入和 Mock 技术详解
前端·单元测试
十连满潜11 天前
springboot集成mockito和jacoco实践
后端·单元测试·mockito
bo5210014 天前
vue3单元测试-项目实战
vue.js·单元测试
bo5210015 天前
vue3单元测试-初步了解
vue.js·单元测试
棉晗榜15 天前
C# .net core添加单元测试项目,依赖注入接口测试
单元测试·c#·.netcore
WangLanguager20 天前
2.4.1 ASPICE的编码与单元测试
单元测试