LoginSignup
0
0

More than 1 year has passed since last update.

【JUnit】mockwebserverのtakeRequestでテストが止まる

Last updated at Posted at 2022-05-21

概要

JUnitを書いていて、WebClientのUTを記載した際、takeRequestで実行内容を取得しようとするところでテストが止まる事象が起きた。同じとこで詰まってる人いたらのため記載。

以下のようにぐるぐるなって進まない。
テストファイル.png

原因

原因説明のために以下にソースを記載する。

テストソース

    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();
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0