使用mockito进行WebClient GET单元测试

mav*_*bhi 1 junit mockito spring-webclient

我面临 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);
    }
Run Code Online (Sandbox Code Playgroud)

我尝试的测试用例失败并出现以下错误:

Strict stubbing argument mismatch. Please check:
 - this invocation of 'uri' method:
    requestHeadersUriSpec.uri(
    com.rs.para.conf.service.ConfigServiceImpl$$Lambda$309/1334433160@3925299f
);
Run Code Online (Sandbox Code Playgroud)

测试用例代码:

@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");
    }
Run Code Online (Sandbox Code Playgroud)

我可以在没有查询参数的情况下运行正常的 GET,但是当我尝试运行这个具有查询参数的测试时,它会给我错误 PS:我不想使用 mockwebserver

Par*_*ala 6

这里的问题是你在方法中使用了 lambda uri。而在测试用例中您使用的是anyString()。另外,由于 URI 有多种实现方式,仅使用 anyString() 是行不通的。所需要的是提供特定的类。

改变

doReturn(requestHeadersMock).when(requestHeadersUriMock)
                .uri(anyString());
Run Code Online (Sandbox Code Playgroud)

 doReturn(requestHeadersMock).when(requestHeadersUriMock).uri(Mockito.any(Function.class));
Run Code Online (Sandbox Code Playgroud)

在这里做工作。