Mocking HttpClient.execute issues: Mockito

匿名 (未验证) 提交于 2019-12-03 00:46:02

问题:

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)



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