当前位置: 首页 > news >正文

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

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

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

什么是mock(模拟)

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

为什么使用mock对象

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

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

mockMvc

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

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

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

例子1:日志输出测试

类中方法:

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

测试代码:

@Resourceprivate 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响应测试用例

类中方法:

 @RequestMapping(value = "/get_header",method = RequestMethod.GET)@ResponseBodypublic 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;}

测试代码:

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

 测试结果:

 

相关文章:

  • C++学习:六个月从基础到就业——C++学习之旅:STL容器详解
  • [特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码
  • OpenLDAP 管理 ELK 用户
  • PHP通讯录网站源码无需sql数据库
  • 【中级软件设计师】程序设计语言基础成分
  • 从零开始创建MCP Server实战指南
  • STM32外部中断与外设中断区别
  • Element Plus表格组件深度解析:构建高性能企业级数据视图
  • Vue2-指令语法
  • C++静态与动态联编区别解析
  • Windows安装Hadoop(图文解说版)
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十二页
  • Spring中配置 Bean 的两种方式:XML 配置 和 Java 配置类
  • NDSS 2025|侧信道与可信计算攻击技术导读(二)系统化评估新旧缓存侧信道攻击技术
  • Mininet--node.py源码解析
  • ViViT: 一种视频视觉Transformer
  • Cline 之Plan和Act模式
  • [大模型]AI Agent入门01——AI Agent概念梳理
  • Ollama 实战手册
  • 植被参数遥感反演技术革命!AI+Python支持向量机/随机森林/神经网络/CNN/LSTM/迁移学习在植被参数反演中的实战应用与优化
  • 国家发改委:将开展市场准入壁垒清理整治行动
  • 法治日报:强制统一店铺广告牌匾事件何以频发?
  • 大家聊中国式现代化|刘亮:因地制宜发展新质生产力,推动经济高质量发展
  • 不朽诗篇的现代重生,意大利音乐剧《神曲》将来华15城巡演
  • 董明珠连任格力电器董事,回应管理层年轻化
  • 第一集|《蛮好的人生》蛮好,《悬镜》挺玄