异步请求

本节展示了如何单独使用 MockMvc 测试异步请求处理。 如果通过 WebTestClient 使用 MockMvc,则无需执行任何特殊操作即可使异步请求工作,因为 WebTestClient 会自动执行本节中描述的操作。

Servlet 异步请求(在 Web MVC 中受支持)的工作原理是退出 Servlet 容器线程并允许应用程序异步计算响应,之后进行异步分派以在 Servlet 容器线程上完成处理。

在 Web MVC Test 中,可以通过首先断言生成的异步值,然后手动执行异步分派,最后验证响应来测试异步请求。 下面是一个针对返回 DeferredResultCallable 或响应式类型(如 Reactor Mono)的控制器方法的示例测试:

// MockMvcRequestBuilders.* 和 MockMvcResultMatchers.* 的静态导入

@Test
void test() throws Exception {
    MvcResult mvcResult = this.mockMvc.perform(get("/path"))
          .andExpect(status().isOk()) (1)
          .andExpect(request().asyncStarted()) (2)
          .andExpect(request().asyncResult("body")) (3)
          .andReturn();

    this.mockMvc.perform(asyncDispatch(mvcResult)) (4)
          .andExpect(status().isOk()) (5)
          .andExpect(content().string("body"));
}
1 检查响应状态仍然未更改
2 异步处理必须已开始
3 等待并断言异步结果
4 手动执行 ASYNC 分派(因为没有运行容器)
5 验证最终响应