【问题标题】:Mockito mocking retrytemplate.execute and return mocked responseMockito 模拟 retrytemplate.execute 并返回模拟响应
【发布时间】:2025-11-27 05:15:02
【问题描述】:

下面是我要测试的代码:

@Autowired
RetryTemplate retryTemplate;

MyResponse response;

response = retryTemplate.execute(new RetryCallback<Mono<MyResponse>, RuntimeException>() {
    public Mono<MyResponse> doRetry(RetryContext context) {
        return webclient.post.body(Mono.just(requestBodyObj), RequestBodyObj.class).retrieve().bodyToMono(MyResponse.class);
    }
});

以下是我正在尝试的测试用例,但出现 Invalid use of matchers 异常。另外,我不确定我的以下代码是否有效。请指导:

MyResponse myResponseObj = new MyResponse();

when(retryTemplate.execute(any(RetryCallback.class))).thenAnswer(invocation -> {
        RetryCallback retry = invocation.getArgument(0);
        when(retry.doWithRetry(Mockito.any())).thenReturn(Mockito.eq(Mono.just(myResponseObj)))
        return retry.doWithRetry(null);
    });

请指导这里的错误是什么以及每当调用retry.doWithRetry 时我如何返回retry.doWithRetry

【问题讨论】:

    标签: java spring-boot unit-testing mockito


    【解决方案1】:

    请看下面的retryTemplate执行方法:

    public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback) throws E {
            return this.doExecute(retryCallback, (RecoveryCallback)null, (RetryState)null);
    }
    

    当我们调用 retryTemplate.execute(retryCallback) 时,doExecute 方法中的其他两个参数为 null,所以基本上这就是你得到 Invalid use of matchers 异常的原因。

    【讨论】: