概要
JUnitを書いていて、WebClientのUTを記載した際、takeRequestで実行内容を取得しようとするところでテストが止まる事象が起きた。同じとこで詰まってる人いたらのため記載。
原因
原因説明のために以下にソースを記載する。
テストソース
MockWebServer mockServer = new MockWebServer();
mockServer.start();
baseUrl = String.format("http://localhost:%s", mockServer.getPort());
mockServer.enqueue(
new MockResponse().setResponseCode(204).addHeader("Content-Type", "application/json"));
// ソース実行
repository.request([リクエストがあれば]);
// ここの処理で止まる(リクエスト待ち状態になる)
final RecordedRequest recordedRequest = mockServer.takeRequest();
テスト対象ソース
以下のようにエラーハンドリングでMono系を返すため、Monoを使用していた。これが原因。
public Mono<Void> request(@NonNull final TestRequest request) {
return webClient.post().uri(
uriBuilder -> uriBuilder.path([PATH]).build())
.body(BodyInserters.fromValue(request))
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse ->
clientResponse.bodyToMono(String.class)
.flatMap(error -> Mono.error(new Exception(
"エラーが発生しました: " + error)))
)
.bodyToMono(requestVoidType);
}
解決策
最後にblockしないとテスト内でリクエストがされていない状態になっていたのでテストソースの方でblockを追加したところ通るようになった。
// before
repository.request([リクエストがあれば]);
//after
repository.request([リクエストがあれば]).block();