非同步請求
本節說明如何單獨使用 MockMvc 來測試非同步請求處理。如果透過 WebTestClient 使用 MockMvc,則無需執行任何特殊操作即可使非同步請求正常工作,因為 WebTestClient
會自動執行本節中描述的操作。
Servlet 非同步請求,Spring MVC 中支援,透過退出 Servlet 容器執行緒並允許應用程式非同步計算回應來工作,之後進行非同步分派以完成 Servlet 容器執行緒上的處理。
在 Spring MVC Test 中,可以透過先斷言產生的非同步值來測試非同步請求,然後手動執行非同步分派,最後驗證回應。以下是控制器方法的範例測試,這些方法傳回 DeferredResult
、Callable
或反應式型別,例如 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 | 驗證最終回應 |