对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

异步请求

本节展示如何单独使用MockMvc来测试异步请求处理。 如果通过WebTestClient使用MockMvc,则无需做任何特殊处理即可使异步请求正常工作,因为WebTestClient会自动完成本节所述的操作。spring-doc.cadn.net.cn

Servlet异步请求(Spring MVC所支持的功能)的工作机制是:退出Servlet容器线程,允许应用程序异步计算响应,之后通过异步分派在Servlet容器线程上完成处理。spring-doc.cadn.net.cn

在Spring MVC测试中,可以通过断言生成的异步值来测试异步请求,然后手动执行异步分发,最后验证响应。以下是针对返回DeferredResultCallable或响应式类型(如Reactor Mono)的控制器方法的测试示例:spring-doc.cadn.net.cn

// static import of MockMvcRequestBuilders.* and 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 验证最终响应
@Test
fun test() {
	var mvcResult = mockMvc.get("/path").andExpect {
		status { isOk() } (1)
		request { asyncStarted() } (2)
		// TODO Remove unused generic parameter
		request { asyncResult<Nothing>("body") } (3)
	}.andReturn()


	mockMvc.perform(asyncDispatch(mvcResult)) (4)
			.andExpect {
				status { isOk() } (5)
				content().string("body")
			}
}
1 检查响应状态是否保持不变
2 异步处理必须已经开始
3 等待并断言异步结果
4 手动执行 ASYNC 分发(因为没有运行的容器)
5 验证最终响应