参考:
SpringBoot 使用 MockMvc 测试 Controller
MockMvc 使用教程
简介
通过字面理解 MockMvc 就是模拟的 MVC 环境。
MockMvc 是 Spring 框架中用于测试 Spring MVC 控制器的一个重要工具。它提供了一个强大的 API,使得开发者能够模拟 HTTP 请求并验证响应。
使用步骤
假设已经引入必要的依赖,使用 MockMvc 进行测试大致分为以下几步:
- 构建请求对象
- 发起请求
- 对请求结果进行处理/校验
- 获取到请求结果
具体到 API 就是:
- 构建 MockMvc 对象
- 构建 MockHttpServletRequestBuilder 对象
- 调用 MockMvc 对象的 perform(MockHttpServletRequestBuilder) 方法,方法返回 ResultActions
- 调用 ResultActions 的处理方法 andDo,进行结果处理(按测试需要执行)
- 调用 ResultActions 的验证方法 andExpect,验证请求结果(按测试需要执行)
- 调用 ResultActions 的 andReturn 方法获取到 MvcResult
示例
@RunWith(SpringRunner.class)
@SpringBootTest
public class MockMvcTest {// 注入 Web 环境的 ApplicationContext 容器@Autowiredprivate WebApplicationContext context;/*** 模拟 Mvc 测试对象*/private MockMvc mockMvc;/*** 所有测试方法执行之前执行该方法*/@Beforepublic void before() throws Exception {// 获取 MockMvc 对象实例mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();}@Testpublic void getInfo3() throws Exception {User user = new User();user.setUsername("Jack");user.setPassword("Jack001");String jsonString = JSON.toJSONString(user);MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/mock/test").param("name", "value").cookie(new Cookie("token", "123456")).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON).header("token", "123456").content(jsonString).accept(MediaType.APPLICATION_JSON);MvcResult mvcResult = mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();System.out.println(mvcResult.getResponse().getContentAsString());}}
MockMvc
- MockMvc 是服务器端 SpringMVC 测试的主入口点。
- 通过 MockMVCBuilders 的静态方法去建造 MockMVCBuilder,MockMvc 由 MockMVCBuilder 构造。
- 核心方法:perform(RequestBuilder rb),执行一个 RequestBuilder 请求,会自动执行 SpringMVC 的流程并映射到相应的控制器执行处理,该方法的返回值是一个 ResultActions。
MockMVCBuilders
- 负责创建 MockMVCBuilder 对象。
- 有两种创建方式
- standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了。
- webAppContextSetup(WebApplicationContext wac):指定 WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的 MockMvc。
MockMvcRequestBuilders
- 用来构建 Request 请求。
- 其主要有两个子类 MockHttpServletRequestBuilder 和 MockMultipartHttpServletRequestBuilder(如文件上传使用)。
- 有一些常用的静态方法:
- get(String url):构建 GET 请求。
- post(String url):构建 POST 请求。
- put(String url):构建 PUT 请求。
- delete(String url):构建 DELETE 请求。
ResultActions
- andExpect:接收 ResultMatcher 验证规则作为参数,验证控制器执行完成后结果是否正确。
- andDo:接收 ResultHandler 结果处理器作为参数,比如调试时打印结果到控制台。
- andReturn:最后返回相应的 MvcResult,然后进行自定义验证/进行下一步的异步处理。
- MockMvcResultMatchers
- 用来匹配执行完请求后的结果验证。
- 如果匹配失败将抛出相应的异常。
- 包含了很多验证 API 方法。
- MockMvcResultHandlers
- 结果处理器,表示要对结果做点什么事情。
- 比如使用 MockMvcResultHandlers.print() 输出整个响应结果信息。
MvcResult
单元测试执行结果,可以针对执行结果进行自定义验证逻辑。采用断言验证数据。