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)
@ResponseBody
public String testLogger() {
Logger logger = LoggerFactory.getLogger(this.getClass());
logger.debug("测试级别日志");
return "SUCCESS";
}
测试代码:
@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响应测试用例
类中方法:
@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;
}
测试代码:
@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();
}
测试结果: