为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 junit mockito 覆盖匿名类重写方法

如何使用 junit mockito 覆盖匿名类重写方法

慕码人2483693 2023-04-13 16:46:00
我有以下代码根据响应代码重试请求。public class Sample {    public static HttpClient getInstance() {        HttpClientBuilder builder = HttpClients.custom();                 builder.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {                int waitPeriod = 200;                @Override                public boolean retryRequest(final HttpResponse response, final int executionCount,                    final HttpContext context) {                    int statusCode = response.getStatusLine().getStatusCode();                    return ((statusCode == 429)&& (executionCount < 3));                }                @Override                public long getRetryInterval() {                    return waitPeriod;                }            });        return builder.build();    }}当我为此方法编写单元测试时,未涵盖getInstance覆盖的方法。(retryRequest, getRetryInterval)我如何编写单元测试来覆盖这些方法。通过谷歌搜索我发现我们可以使用ArgumentCaptor. 我试过下面的代码,但它不起作用。import static org.mockito.Mockito.when;import static org.mockito.Mockito.verify;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.ServiceUnavailableRetryStrategy;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.client.HttpClients;import org.apache.http.protocol.HttpContext;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.ArgumentCaptor;import org.mockito.Mock;}argumentCaptor.capture()总是给我null。我越来越喜欢org.mockito.exceptions.base.MockitoException:没有捕获到参数值!您可能忘记在 verify() 中使用 argument.capture()... ...或者您在存根中使用了 capture() 但未调用存根方法。谁可以帮我这个事。我想测试 retryRequest 方法的功能。
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

编辑:改写答案以使其更易于阅读。


  1. 应该由 PowerMockito 处理的类需要在@PrepareForTest注释中声明。

  2. 如果注释用于创建模拟,则所有未在注释中声明的带注释的类@PrepareForTest都由 Mockito 创建。

  3. 如果注释用于创建模拟并被MockitoAnnotations.initMocks(this);调用,这显然会导致声明被覆盖,所有模拟都由 Mockito 创建。(来源:https ://groups.google.com/forum/#!topic/powermock/yPBey4hr7IU )

  4. Mockito 无法处理静态或最终方法。
    模拟操作可能会无提示地失败。


你的问题的根源是这HttpClientBuilder#setServiceUnavailableRetryStrategy是一个最终的方法,因此不能被 Mockito 处理。

解决方案是 Mock ofHttpClientBulder必须由 PowerMockito 处理。按照1.它的需要在@PrepareForTest注解中声明。

@PrepareForTest({ HttpClients.class, HttpClientBuilder.class, Sample.class})


如果你想使用注释来创建模拟,你不能调用

MockitoAnnotations.initMocks(this);

(见2./我用最新的 powermockito 版本(1.7.4 / 2.0.2)验证了这个问题)


否则你必须手动创建模拟。

HttpClientBuilder clientBuilderMock = PowerMockito.mock(HttpClientBuilder.class);


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 272 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信