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

我有以下代码根据响应代码重试请求。


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 方法的功能。


慕码人2483693
浏览 202回答 1
1回答

繁花不似锦

编辑:改写答案以使其更易于阅读。应该由 PowerMockito 处理的类需要在@PrepareForTest注释中声明。如果注释用于创建模拟,则所有未在注释中声明的带注释的类@PrepareForTest都由 Mockito 创建。如果注释用于创建模拟并被MockitoAnnotations.initMocks(this);调用,这显然会导致声明被覆盖,所有模拟都由 Mockito 创建。(来源:https&nbsp;://groups.google.com/forum/#!topic/powermock/yPBey4hr7IU )Mockito 无法处理静态或最终方法。模拟操作可能会无提示地失败。你的问题的根源是这HttpClientBuilder#setServiceUnavailableRetryStrategy是一个最终的方法,因此不能被 Mockito 处理。解决方案是 Mock ofHttpClientBulder必须由 PowerMockito 处理。按照1.它的需要在@PrepareForTest注解中声明。@PrepareForTest({&nbsp;HttpClients.class,&nbsp;HttpClientBuilder.class,&nbsp;Sample.class})如果你想使用注释来创建模拟,你不能调用MockitoAnnotations.initMocks(this);(见2./我用最新的 powermockito 版本(1.7.4 / 2.0.2)验证了这个问题)否则你必须手动创建模拟。HttpClientBuilder&nbsp;clientBuilderMock&nbsp;=&nbsp;PowerMockito.mock(HttpClientBuilder.class);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java