Mocking HttpClient.execute issues: Mockito

我与影子孤独终老i 提交于 2019-12-08 14:00:17

问题


I am trying to test this method.

@Override
public JSON connectResource() throws IOException {
    //get the location and credentials for the certificates
    System.setProperty("javax.net.ssl.trustStore", "C:/Program Files/Java/jdk1.7.0_40/jre/lib/security/cacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    HttpRequest httpRequest = new HttpGet(url);
    System.out.println("hello");
    httpRequest.addHeader("Accept", "application/json");
    HttpResponse response = httpClient.execute((HttpUriRequest) httpRequest);
    System.out.println("hello1");
    HttpEntity httpEntity = response.getEntity();
    String data = this.getData(httpEntity);
    return  JSONSerializer.toJSON(data.toString());
}

My set up method is:

@Before
public void setUp() throws Exception{
    mockHttpClient = mock(DefaultHttpClient.class);
    mockHttpRequest = mock(HttpUriRequest.class);
    mockHttpResponse = mock(BasicHttpResponse.class);
    mockHttpEntity = mock(HttpEntity.class);
    mockInputStream = mock(InputStream.class);
    mockInputStreamReader = mock(InputStreamReader.class);
    mockBufferedReader = mock(BufferedReader.class);
    mockHttpGet = mock(HttpGet.class);
    mockHttpRequestBase = mock(HttpRequestBase.class);
    //when(mockHttpClient.execute(Mockito.isA(HttpUriRequest.class))).thenReturn(mockHttpResponse);
    //when(mockHttpClient.execute(mockHttpRequest)).thenReturn(mockHttpResponse);
    //when(mockHttpClient.execute(mockHttpRequestBase)).thenReturn(mockHttpResponse);
    //when(mockHttpClient.execute(mockHttpGet)).thenReturn(mockHttpResponse);

    when(mockHttpResponse.getEntity()).thenReturn(mockHttpEntity);
    when(mockHttpEntity.getContent()).thenReturn(mockInputStream);
    PowerMockito.whenNew(InputStreamReader.class)
            .withArguments(mockInputStream).thenReturn(mockInputStreamReader);
    PowerMockito.whenNew(BufferedReader.class)
            .withArguments(mockInputStreamReader).thenReturn(mockBufferedReader);
    PowerMockito.when(mockBufferedReader.readLine())
            .thenReturn(JSON_STRING)
            .thenReturn(null);
    PowerMockito.whenNew(HttpGet.class).withArguments(VALID_URL)
            .thenReturn(mockHttpGet);
}

And my test case is :

 @Test
    public void testConnectResource() throws IOException {
        when(mockHttpClient.execute(mockHttpGet)).thenReturn(mockHttpResponse);
        HttpConnectGithub connHandle = new HttpConnectGithub(VALID_URL);
        JSON jsonObject = connHandle.connectResource();
        System.out.println(jsonObject);
        //assertThat(jsonObject, instanceOf(JSON.class));
    }

However, the execution stops at

HttpResponse response = httpClient.execute((HttpUriRequest) httpRequest);

you can see all that I tried in the comments of my set up method. Does anyone find an issue with anything? I debugged through my test case and all mock objects are properly initialized. I have tried exchanging HttpUriRequest and HttpRequest, HttpResponse and BasicHttpResponse etc but without much luck. Please guide on how to tackle this issue.


回答1:


Part of the problem you're running into is matching the arguments:

@Test
public void testConnectResource() throws IOException {
    when(mockHttpClient.execute(mockHttpGet)).thenReturn(mockHttpResponse);
    HttpConnectGithub connHandle = new HttpConnectGithub(VALID_URL);
    JSON jsonObject = connHandle.connectResource();
    System.out.println(jsonObject);
    //assertThat(jsonObject, instanceOf(JSON.class));
}

With the line you've specified above

when(mockHttpClient.execute(mockHttpGet)).thenReturn(mockHttpResponse);

The mocking will only trigger when the instance of mockHttpGet you've defined is passed.

Your method under test on the other hand is creating a new HttpGet instance which is not going to be the same as the mockHttpGet instance. You will need to alter the 'when' statement so that you have something like

when(mockHttpClient.execute(Matchers.any(HttpGet.class))).thenReturn(mockHttpResponse);

I'm doing this exclusively from memory so the Matchers.any() may be incorrect, but you should be able to make headway based on what I've given you above.




回答2:


The problem is with mockHttpClient. It is not able to mock it automatically for some reason. The fix is to pass httpclient as a parameter through some method (constructor in my case)



来源:https://stackoverflow.com/questions/19626609/mocking-httpclient-execute-issues-mockito

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!