2016-07-27 2 views
0

Это мой класс под тест:PowerMockito.doReturn возвращает нуль

public class A { 

public Integer callMethod(){ 
    return someMethod(); 
} 


private Integer someMethod(){ 
    //Some Code 
    HttpPost httpPost = new HttpPost(oAuthMessage.URL); 
    //Some Code 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpResponse httpResponse = httpClient.execute(httpPost); ------1 
    Integer code = httpResponse.getStatusLine().getStatusCode(); ---2 
    return code; 
} 

Теперь я хочу, чтобы дразнить линии 1 возвращение макет HttpResponse & кода.

Я попытался это, но не смог:

@RunWith(PowerMockRunner.class) 
@PowerMockIgnore("javax.crypto.*") 
public class TestA { 

//Spying some things here & Injecting them 

@Test 
public void testA() { 


    DefaultHttpClient defaultHttpClientMock = PowerMockito.mock(DefaultHttpClient.class); 
    HttpResponse httpResponse = PowerMockito.mock(HttpResponse.class, RETURNS_DEEP_STUBS); 
    HttpClient httpClient = PowerMockito.mock(HttpClient.class); 
    //HttpResponse httpResponseMock PowerMockito.mock(HttpResponse.class); 
    HttpPost httpPost = PowerMockito.mock(HttpPost.class); 
    PowerMockito.whenNew(DefaultHttpClient.class).withNoArguments().thenReturn(defaultHttpClientMock); 
    PowerMockito.doReturn(httpResponse).when(httpClient).execute(httpPost);  //Returns null. It never returns httpResponse. 
    PowerMockito.when(httpResponse.getStatusLine().getStatusCode()).thenReturn(anyInt()); 
    //call the method 
} 

PowerMockito.doReturn(httpResponse).when(httpClient).execute(httpPost) всегда возвращает нуль. Я хочу, чтобы он возвращал макет объекта HttpResponse. Я прочитал другие сообщения, связанные с этой ошибкой, но не уверен, что делать в моем случае. Может ли кто-нибудь помочь?

ответ

1

Вместо

PowerMockito.doReturn(httpResponse).when(httpClient).execute(httpPost);

вы должны использовать

PowerMockito.when(httpResponse.execute(httpPost)).thenReturn(httpResponse); 

У вас также есть некоторые проблемы в тесте: неправильный издевательский конструктор и вам не нужно HTTPResponse вообще.

Update Этот код работает правильно для меня:

@RunWith(PowerMockRunner.class) 
@PowerMockIgnore("javax.crypto.*") 
@PrepareForTest({ HttpPost.class, DefaultHttpClient.class, A.class }) 
public class TestA { 

    @Test 
    public void testA() throws Exception { 
     HttpPost httpPost = Mockito.mock(HttpPost.class); 
     PowerMockito.whenNew(HttpPost.class).withArguments(oAuthMessage.URL).thenReturn(httpPost); 

     DefaultHttpClient defaultHttpClientMock = PowerMockito.mock(DefaultHttpClient.class); 
     HttpResponse httpResponse = PowerMockito.mock(HttpResponse.class); 
     PowerMockito.whenNew(DefaultHttpClient.class).withNoArguments().thenReturn(defaultHttpClientMock); 

     PowerMockito.when(defaultHttpClientMock.execute(httpPost)).thenReturn(httpResponse); 

     StatusLine statusLine = PowerMockito.mock(StatusLine.class); 

     PowerMockito.when(httpResponse.getStatusLine()).thenReturn(statusLine); 
     Integer expected = new Integer(0); 
     PowerMockito.when(statusLine.getStatusCode()).thenReturn(expected); 

     A a = new A(); 
     Assert.assertEquals(expected, a.callMethod()); 
    } 
} 
+0

Я не уверен в строке «неправильного насмешливым конструктора и вам не нужно HTTPResponse вообще.» Не могли бы вы объяснить? @Evgeniy K. – Ajit

+0

Даже после того, как вы предложили «PowerMockito.when (httpClient.execute (httpPost)). ThenReturn (httpResponse)' возвращает значение null. – Ajit

+0

@SumitPal Просто попробуйте, и вы увидите, что код не работает во время выполнения метода. Как высмеять конструктор, который вы можете увидеть на этом сайте, просто выполните поиск. Вы делаете это неправильно, по крайней мере, вам нужно «@PrepareForTest» ({HttpPost.class, DefaultHttpClient.class, A.class}) »или переписать код в классе A, чтобы минимизировать количество вызывающих конструкторов в методе. О httpResponse - удалить его вообще и использовать defaultHttpClientMock. –