SpringBoot MockMVC 的使用
参考:
SpringBoot 使用 MockMvc 测试 Controller
MockMvc 使用教程
Java - Junit: mockMvc headers don't allow to use Cookies?
简介
通过字面理解 MockMvc 就是模拟的 MVC 环境。
MockMvc 是 Spring 框架中用于测试 SpringMVC 控制器的一个重要工具。它提供了一个强大的 API,使得开发者能够模拟 HTTP 请求并验证响应。
使用步骤
假设已经引入必要的依赖,使用 MockMvc 进行测试大致分为以下几步:
- 构建请求对象
- 发起请求
- 对请求结果进行处理/校验
- 获取到请求结果
具体到 API 就是:
- 构建 MockMvc 对象
- 构建 RequestBuilder 对象
- 调用 MockMvc 对象的 perform(RequestBuilder requestBuilder) 方法,方法返回 ResultActions
- 调用 ResultActions 的处理方法 andDo,进行结果处理(按测试需要执行)
- 调用 ResultActions 的验证方法 andExpect,验证请求结果(按测试需要执行)
- 调用 ResultActions 的 andReturn 方法获取到 MvcResult
示例
@RunWith(SpringRunner.class)
@SpringBootTest
public class MockMvcTest {
// 注入 Web 环境的 ApplicationContext 容器
@Autowired
private WebApplicationContext context;
/**
* 模拟 Mvc 测试对象
*/
private MockMvc mockMvc;
/**
* 所有测试方法执行之前执行该方法
*/
@Before
public void before() throws Exception {
// 获取 MockMvc 对象实例
mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public 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
单元测试执行结果,可以针对执行结果进行自定义验证逻辑,或获取数据进行下一步请求。