【问题标题】:Test with MockWebServer never finishes使用 MockWebServer 进行测试永远不会完成
【发布时间】:2022-01-04 20:21:45
【问题描述】:

我有一个实现 CommandLineRunner 的类,在它的 run 方法中,webClient 发出请求并对响应进行一些处理,包括我想在测试中验证的方法:

@RequiredArgsConstructor
public class WowGreatClass implements CommandLineRunner {
    private final WebClient webClient;

    @Override
    public void run(String... args) {
        webClient.get()
            .uri("/foo")
            .retrieve()
            .bodyToMono(PairsResponseDto.class)
            .flatMap(response -> Flux.fromIterable(response.getResult()))
            .collectList()
            .map(this::methodToTest)
            //...
        ).block(); 
    }
}

所以我在测试中使用了 MockWebServer,如下所示:

@ExtendWith(MockitoExtension.class)
public class WowGreatTest {

    MockWebServer mockServer = new MockWebServer();

    @Spy
    WowGreatClass greatClass = new WowGreatClass(WebClient.create(mockServer.url("/").toString()));

    @Captor
    ArgumentCaptor<String> captor;

    @Test
    public void testTheThing() {
        mockServer.enqueue(
            new MockResponse()
                .setResponseCode(200)
                .addHeader("Content-Type", "application/json")
                .setBody("something really interesting"));

        greatClass.run();
        verify(greatClass).methodToTest(captor.capture());
    }
}

MockWebServer 在测试期间做了它应该做的事情,问题是在初始请求之后它似乎只是永远挂起等待更多。 run() 方法永远不会完成,verify() 调用永远不会到达。我在这里遗漏了一些明显的东西,还是出了什么问题?

【问题讨论】:

    标签: java spring-boot junit mockito


    【解决方案1】:

    MockServer.url("/") 返回如下内容: http://kubernetes.docker.internal:49954/ 因此,当您在运行方法中将其传递给 WebClient 时,您的 url 看起来像: http://kubernetes.docker.internal:49954//foo// 因为您的 WebClient 构建器中有 .uri("/foo")

    不要使用mockServer.url("/").toString(),而是使用"http://localhost:" + mockServer.getPort()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2021-06-15
      相关资源
      最近更新 更多