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

测试结果:

相关推荐
懒羊羊大王&14 小时前
软件测试之博客系统项目实战(补充和解析部分)
selenium·单元测试·测试用例·集成测试
真智AI15 小时前
用 LLM 辅助生成可跑的 Python 单元测试:pytest + coverage 覆盖率报告(含运行指令与排坑)
python·单元测试·pytest
独处东汉1 天前
freertos开发空气检测仪之串口驱动与单元测试实践
单元测试·log4j
Warren981 天前
Allure 常用装饰器:实战用法 + 最佳实践(接口自动化)
运维·服务器·git·python·单元测试·自动化·pytest
Warren982 天前
Pytest Fixture 到底该用 return 还是 yield?
数据库·oracle·面试·职场和发展·单元测试·pytest·pyqt
Warren983 天前
Pytest Fixture 作用域详解:Function、Class、Module、Session 怎么选
面试·职场和发展·单元测试·pytest·pip·模块测试·jira
一晌小贪欢4 天前
Python 测试利器:使用 pytest 高效编写和管理单元测试
python·单元测试·pytest·python3·python测试
汽车仪器仪表相关领域5 天前
MTX-A 模拟废气温度(EGT)计 核心特性与车载实操指南
网络·人工智能·功能测试·单元测试·汽车·可用性测试
卓码软件测评5 天前
第三方软件课题验收测试【使用Docker容器部署LoadRunner负载生成器以实现弹性压测 】
测试工具·docker·容器·性能优化·单元测试·测试用例
Apifox.6 天前
Apifox 1 月更新|MCP 调试、测试套件、测试报告重构、网络信息查看、Hoppscotch 导入
前端·人工智能·测试工具·单元测试·团队开发