非同步請求

本節說明如何單獨使用 MockMvc 來測試非同步請求處理。如果透過 WebTestClient 使用 MockMvc,則無需執行任何特殊操作即可使非同步請求正常工作,因為 WebTestClient 會自動執行本節中描述的操作。

Servlet 非同步請求,Spring MVC 中支援,透過退出 Servlet 容器執行緒並允許應用程式非同步計算回應來工作,之後進行非同步分派以完成 Servlet 容器執行緒上的處理。

在 Spring MVC Test 中,可以透過先斷言產生的非同步值來測試非同步請求,然後手動執行非同步分派,最後驗證回應。以下是控制器方法的範例測試,這些方法傳回 DeferredResultCallable 或反應式型別,例如 Reactor Mono

  • Java

  • Kotlin

// 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 驗證最終回應