使用 mockito 的 WebClient GET 单元测试
WebClient GET unit test with mockito
我遇到了 Webclient 和 mockito 的问题
以下是我的服务代码:
public Flux<Config> getConfigs(String param1, String param2) {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
if(!StringUtils.isEmpty(param2)) {
queryParams.add("name", param2);
}
String path = "api/v1/config";
return webClient.get().uri(uriBuilder -> uriBuilder.path(path)
.queryParams(queryParams)
.build())
.retrieve().bodyToFlux(Config.class)
.doOnError(MyRuntimeException::throwError);
}
我正在尝试的测试用例失败并出现以下错误:
Strict stubbing argument mismatch. Please check:
- this invocation of 'uri' method:
requestHeadersUriSpec.uri(
com.rs.para.conf.service.ConfigServiceImpl$$Lambda9/1334433160@3925299f
);
测试用例代码:
@Test
public void testConfig() {
List<Config> configs = new ArrayList<>();
doReturn(requestHeadersUriMock).when(webClientMock).get();
doReturn(requestHeadersMock).when(requestHeadersUriMock)
.uri(anyString());
doReturn(responseMock).when(requestHeadersMock).retrieve();
doReturn(Flux.fromIterable(configs)).when(responseMock).bodyToFlux(Config.class);
Flux<Config> configFlux = configService.getConfigs("100005", "test");
}
我可以 运行 没有查询参数的正常 GET 但是当我尝试 运行 这个有查询参数的测试时它给我错误
PS: 我不想使用 mockwebserver
这里的问题是您在 uri
方法中使用了 lambda。而在测试用例中,您使用的是 anyString()。此外,由于 URI 有多种实现方式,仅使用 anyString() 是行不通的。提供特定的 class 是必需的。
改变
doReturn(requestHeadersMock).when(requestHeadersUriMock)
.uri(anyString());
到
doReturn(requestHeadersMock).when(requestHeadersUriMock).uri(Mockito.any(Function.class));
这里的工作。
我遇到了 Webclient 和 mockito 的问题 以下是我的服务代码:
public Flux<Config> getConfigs(String param1, String param2) {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
if(!StringUtils.isEmpty(param2)) {
queryParams.add("name", param2);
}
String path = "api/v1/config";
return webClient.get().uri(uriBuilder -> uriBuilder.path(path)
.queryParams(queryParams)
.build())
.retrieve().bodyToFlux(Config.class)
.doOnError(MyRuntimeException::throwError);
}
我正在尝试的测试用例失败并出现以下错误:
Strict stubbing argument mismatch. Please check:
- this invocation of 'uri' method:
requestHeadersUriSpec.uri(
com.rs.para.conf.service.ConfigServiceImpl$$Lambda9/1334433160@3925299f
);
测试用例代码:
@Test
public void testConfig() {
List<Config> configs = new ArrayList<>();
doReturn(requestHeadersUriMock).when(webClientMock).get();
doReturn(requestHeadersMock).when(requestHeadersUriMock)
.uri(anyString());
doReturn(responseMock).when(requestHeadersMock).retrieve();
doReturn(Flux.fromIterable(configs)).when(responseMock).bodyToFlux(Config.class);
Flux<Config> configFlux = configService.getConfigs("100005", "test");
}
我可以 运行 没有查询参数的正常 GET 但是当我尝试 运行 这个有查询参数的测试时它给我错误 PS: 我不想使用 mockwebserver
这里的问题是您在 uri
方法中使用了 lambda。而在测试用例中,您使用的是 anyString()。此外,由于 URI 有多种实现方式,仅使用 anyString() 是行不通的。提供特定的 class 是必需的。
改变
doReturn(requestHeadersMock).when(requestHeadersUriMock)
.uri(anyString());
到
doReturn(requestHeadersMock).when(requestHeadersUriMock).uri(Mockito.any(Function.class));
这里的工作。