@LoadBalanced WebClient不适用于@RestClientTest单元测试

时间:2019-06-07 20:37:08

标签: spring-boot spring-cloud spring-cloud-netflix

我有一些标注为@RestClientTest的测试,该测试使用@LoadBalanced WebClient.Builder调用服务。我有一个MockWebServer在模拟正确的端口上运行该服务。我使用Ribbon进行负载平衡。测试运行时出现以下异常:

eactor.core.Exceptions$ReactiveException: java.net.UnknownHostException: orchestration

at reactor.core.Exceptions.propagate(Exceptions.java:326)
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:91)
at reactor.core.publisher.Mono.block(Mono.java:1494) ...

我的Bean定义:

@LoadBalanced
public WebClient.Builder asyncWebClientBuilder() {
    TcpClient tcpClient = TcpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout) // Connection Timeout
            .doOnConnected(connection ->
                    connection.addHandlerLast(new ReadTimeoutHandler(readTimeout))); // Read Timeout)
    return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)));

客户代码:

return client.build()
            .method(method)
            .uri(initUriTemplateHandler()
                    .expand(url, uriVariables))
            .body(BodyInserters.fromObject(requestEntity))
            .exchange()
            .block();

奇怪的是,当我在真实环境中针对真实服务运行相同的客户端代码时,它们完全可以正常工作。我也有一些带有@SpringBootTest注释的测试,并且在相同的客户端下使用了相同的客户端,这些客户端平衡了负载并可以正常工作。它仅在@RestClientTest情况下不负载均衡。 我在这里想念的是什么? 我正在使用Spring Boot 2.1.3

0 个答案:

没有答案