非同期リクエスト

このセクションでは、MockMvc を単独で使用して非同期リクエスト処理をテストする方法を示します。WebTestClient を介して MockMvc を使用する場合、WebTestClient はこのセクションで説明されていることを自動的に実行するため、非同期リクエストを機能させるために特別なことは何もしません。

Spring MVC でサポートされているサーブレット非同期リクエストは、サーブレットコンテナースレッドを終了し、アプリケーションがレスポンスを非同期で計算できるようにすることで機能します。その後、非同期ディスパッチが行われ、サーブレットコンテナースレッドでの処理が完了します。

Spring MVC テストでは、生成された非同期値を最初にアサートし、次に非同期ディスパッチを手動で実行し、最後にレスポンスを検証することで、非同期リクエストをテストできます。以下は、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 待機して非同期結果をアサートします
4ASYNC ディスパッチを手動で実行する (実行中のコンテナーがないため)
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 待機して非同期結果をアサートします
4ASYNC ディスパッチを手動で実行する (実行中のコンテナーがないため)
5 最終レスポンスを確認する