[英]How to mock Spring @Autowired WebClient response in @Service?
[英]How to mock Spring WebClient and builder
我正在尝试模拟 Spring WebClient 并且遇到了 WebClient.builder() 模拟问题。 到目前为止我在测试中定义的模拟没有被使用,我想是因为这个构建器没有返回我的模拟 WebClient。 我怎样才能让建造者归还我的模拟?
WebClient webClient = WebClient.builder()
.exchangeStrategies(ExchangeStrategies.builder()
.codecs(configurer -> configurer
.defaultCodecs()
.maxInMemorySize(16 * 1024 * 1024))
.build())
.clientConnector(new ReactorClientHttpConnector(HttpClient.newConnection().compress(true)))
.build();
并且 WebClient 是这样使用的:
response = webClient
.get()
.uri(URLDecoder.decode(someEndpoint.replace("\"", ""), CLIENT_ENCODING))
.header(AUTHORIZATION, BEARER + accessToken)
.accept(MediaType.APPLICATION_JSON)
.retrieve().bodyToMono(JsonNode.class).block();
当我遵循这些解决方案时,我没有看到模拟有任何问题: How to mock Spring WebFlux WebClient? 但没有使用模拟。 如何模拟构建器/从构建器返回我的模拟?
您需要模拟WebClient
的静态方法builder()
。 事实上,如果这个方法没有被模拟,mockito 就不能编辑这个方法的行为。 因此,不使用您模拟的 webClient。 要执行此操作,如果您使用 maven,则需要在pom.xml
包含此依赖项。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.4.6</version>
<scope>test</scope>
</dependency>
这将在Mockito
上提供mockStatic()
方法,可以像这样使用:
MockedStatic<WebClient> webClientStatic = Mockito.mockStatic(WebClient.class);
webClientStatic.when(WebClient::builder).thenReturn(webClientBuilder);
webClientBuilder
必须被模拟,因为我们需要改变它的方法build()
行为来返回你模拟的 webClient。
Mockito.when(webClientBuilder.build()).thenReturn(mockedWebClient);
要在一个代码中恢复所有内容:
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import org.mockito.MockedStatic;
@RunWith(MockitoJUnitRunner.class)
public class WebClientTest {
@Mock
private WebClient.Builder webClientBuilder;
@Mock
private WebClient mockedWebClient;
@Before
public void setup() {
Mockito.when(webClientBuilder.exchangeStrategies(Mockito.any(ExchangeStrategies.class))).thenReturn(webClientBuilder);
Mockito.when(webClientBuilder.clientConnector(Mockito.any(ReactorClientHttpConnector.class))).thenReturn(webClientBuilder);
Mockito.when(webClientBuilder.build()).thenReturn(mockedWebClient);
}
@Test
public void testWebClient() {
final MockedStatic<WebClient> webClientStatic = Mockito.mockStatic(WebClient.class);
webClientStatic.when(WebClient::builder).thenReturn(webClientBuilder);
final WebClient webClient = WebClient.builder()
.exchangeStrategies(ExchangeStrategies.builder()
.codecs(configurer -> configurer
.defaultCodecs()
.maxInMemorySize(16 * 1024 * 1024))
.build())
.clientConnector(new ReactorClientHttpConnector(HttpClient.newConnection().compress(true)))
.build();
//It throws error if webClient is not mockedWebClient
Assert.assertEquals(webClient, mockedWebClient);
}
}
你可以测试一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.