不使用InjectMocks创建对象会导致httpClient出现问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不使用InjectMocks创建对象会导致httpClient出现问题相关的知识,希望对你有一定的参考价值。

我有一个具有默认构造函数的类。在这个构造函数中,有很多成员被初始化为:

public classs MyClass{
private String variable1=null;
private String param1="2000";
private String param2="2000";
public MyClass() {

        variable1 = getProperty("iaRequestPath");
        timeout = Integer.parseInt(getProperty("param1"));
        reuqestUrl = getProperty("reuqestUrl");
        try {
            String maxConnection = getProperty("maxConnection");
            int connections =0;
             int param3=0;
            param3 = validateMethod(maxConnection);//Here parse Int will happen
             param4 = validateResource(defaultMaxConnPerRoute);
            param5 = validateResource(maxConnPerIAroute);
            HttpCoreConnectionFactory factory = new HttpCoreConnectionFactory(parma1, param2, null, 0, 
                                                                null, "SOME_VALUE");
            httpclient = factory.getPooledHttpCoreClient(param3, param4, param5, reuqestUrl);
        } catch (Exception exp) {

        }

    }

如果我使用@InjectMocks,我无法模拟构造函数成员,因为在我的测试类中发生模拟之前将调用构造函数。我避免在我的测试类中使用注入模拟和手动创建的对象。像MyClass testClass=new MyClass();和嘲笑的httpClient一样

HttpClient httpClient =PowerMockito.mock(HttpClient.class);

httpClient始终在我的实际代码中抛出null,因为HttpClient在构造函数中被初始化。如何克服这种情况基本上我不需要构造函数初始化的httpclient值而是我需要它来自Mock

虽然我嘲笑它没有被嘲笑的价值。

提前致谢。

答案

我会使用Powermock来模拟工厂的创建。然后模拟getPooledHttpCoreClient方法返回httpClient的模拟:

@RunWith(PowerMockRunner.class)
@PrepareForTest(HttpCoreConnectionFactory.class)
public class MyClassTest{


@Mock
private HttpCoreConnectionFactory factoryMock;

@Mock
private HttpClient httpClientMock;

@Before
public void init(){
   MockitoAnnotations.initMocks(this);

@Test
public void testMethod(){

    // Arrange
    PowerMockito.whenNew(HttpCoreConnectionFactory.class)
     .withArguments(Mockito.anyString(), Mockito.anyString()...).thenReturn(factoryMock);

    doReturn(httpClientMock).when(factoryMock)
        .getPooledHttpCoreClient(Mockito.anyString(), Mockito.anyString()...);

    // prepare the httpClientMock using when() etc..

    // Act
    MyClass myClass = new MyClass();

    // assertions

以上是关于不使用InjectMocks创建对象会导致httpClient出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在使用@InjectMocks注入模拟对象内部之前初始化它

Kotlin,Spring book,Mockito,@InjectMocks,使用与创建的不同的模拟

InjectMocks 不适用于具有默认值的 Kotlin 构造函数参数

使用 @InjectMocks 注入 String 属性

如何在 Junit 中使用 @InjectMocks 和 @Autowired 注释

在 Mockito Junit 中 @InjectMocks 后为空