跳到主要内容

异步请求

DeepSeek V3 中英对照 Async Requests

本节展示了如何单独使用 MockMvc 来测试异步请求处理。如果通过 WebTestClient 使用 MockMvc,则无需做任何特殊操作来使异步请求正常工作,因为 WebTestClient 会自动完成本节中描述的内容。

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

在 Spring MVC 测试中,可以通过首先断言生成的异步值,然后手动执行异步调度,最后验证响应来测试异步请求。以下是一个针对返回 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"));
}
java
  • 检查响应状态是否仍然未改变

  • 异步处理必须已启动

  • 等待并断言异步结果

  • 手动执行 ASYNC 调度(因为没有正在运行的容器)

  • 验证最终响应