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

测试结果:

相关推荐
MC皮蛋侠客14 小时前
Google Test 单元测试指南
c++·单元测试·google test
英俊潇洒美少年2 天前
前端 Jest 单元测试零基础实战:模板、提效、避坑、面试题(Vue 项目可用)
前端·vue.js·单元测试
测试员周周6 天前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例
测试员周周6 天前
【Appium 系列】第17节-XMind用例转换 — 从思维导图到 YAML
java·服务器·人工智能·单元测试·appium·测试用例·xmind
一路往蓝-Anbo6 天前
第五章:如何对 HAL 库本身进行单元测试?
网络·数据结构·stm32·单片机·嵌入式硬件·单元测试·tdd
计算机安禾6 天前
【c++面向对象编程】第49篇:面向对象的单元测试:用GoogleTest测试类
开发语言·c++·单元测试
测试员周周6 天前
【Appium 系列】第20节-测试项目结构设计 — 从脚本到工程
人工智能·数据挖掘·回归·单元测试·appium·测试用例·测试覆盖率
数字供应链安全产品选型6 天前
2025年Gartner中国安全技术成熟度曲线解读:软件供应链安全从“过热”到“落地”的演进之路
人工智能·web安全·单元测试·软件供应链安全
测试员周周7 天前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium
回眸&啤酒鸭7 天前
【回眸】嵌入式软件单元测试工具链实战指南
开发语言·单元测试·白盒测试