SpringBoot MockMVC 的使用

Higurashi-kagome / 2024-09-18 / 原文

参考:

SpringBoot 使用 MockMvc 测试 Controller

MockMvc 使用教程

Java - Junit: mockMvc headers don't allow to use Cookies?

简介

通过字面理解 MockMvc 就是模拟的 MVC 环境。

MockMvc 是 Spring 框架中用于测试 SpringMVC 控制器的一个重要工具。它提供了一个强大的 API,使得开发者能够模拟 HTTP 请求并验证响应。

使用步骤

假设已经引入必要的依赖,使用 MockMvc 进行测试大致分为以下几步:

  1. 构建请求对象
  2. 发起请求
  3. 对请求结果进行处理/校验
  4. 获取到请求结果

具体到 API 就是:

  1. 构建 MockMvc 对象
  2. 构建 RequestBuilder 对象
  3. 调用 MockMvc 对象的 perform(RequestBuilder requestBuilder) 方法,方法返回 ResultActions
  4. 调用 ResultActions 的处理方法 andDo,进行结果处理(按测试需要执行)
  5. 调用 ResultActions 的验证方法 andExpect,验证请求结果(按测试需要执行)
  6. 调用 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 请求。
  • 其主要有两个子类 MockHttpServletRequestBuilderMockMultipartHttpServletRequestBuilder(如文件上传使用)。
  • 有一些常用的静态方法:
    • 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

单元测试执行结果,可以针对执行结果进行自定义验证逻辑,或获取数据进行下一步请求。