使用 mockito 进行 WebClient GET 单元测试

时间:2021-06-25 12:37:43

标签: junit mockito spring-webclient

我遇到了 Webclient 和 mockito 的问题 以下是我的服务代码:

    from sympy import *
    def myPrintMatrix():
        return Matrix([11,12]), \
               Matrix([21,22])
    print(myPrintMatrix())
    # (Matrix([
    # [11],
    # [12]]), Matrix([
    # [21],
    # [22]]))
    ################################
    # I want bellow.
    # Matrix([11, 12]),
    # Matrix([21, 22])
    # or 
    # Matrix([11, 12]),Matrix([21, 22])
    # why print? [12]]), Matrix([

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

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$$Lambda$309/1334433160@3925299f
);

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

1 个答案:

答案 0 :(得分:0)

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

变化

doReturn(requestHeadersMock).when(requestHeadersUriMock)
                .uri(anyString());

 doReturn(requestHeadersMock).when(requestHeadersUriMock).uri(Mockito.any(Function.class));

在这里施展魔法。