In my test class I am mocking HTTPclient but when I run test class it calls actual method instead of mock at line
final HttpResponse response = httpClient.execute(postRequest);
and gives me java.lang.IllegalStateException.
Here is my code
final HttpClient httpClient = new DefaultHttpClient();
final HttpPost postRequest = new HttpPost(someURL);
final String inputJson = mapper.writeValueAsString(someObj);
final StringEntity input = new StringEntity(inputJson);
input.setContentType("application/json");
postRequest.setEntity(input);
final HttpResponse response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
}
final BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
and here is my Test class code
public class XGenericServiceTest {
@InjectMocks
private XGenericService xGenericService = new XGenericService();
@Mock
HttpClient httpClient;
@Mock
HttpResponse httpResponse;
@Mock
HttpEntity httpEntity;
@Mock
StatusLine statusLine;
@Mock
HttpPost httpPost;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testgetXClient(){
try {
String s = "[{\"firstName\":\"adasd\"}]";
when(httpClient.execute(Mockito.isA(HttpPost.class))).thenReturn(httpResponse);
when(httpResponse.getStatusLine()).thenReturn(statusLine);
when(statusLine.getStatusCode()).thenReturn(HttpStatus.SC_OK);
when(httpEntity.getContent()).thenReturn(new ByteArrayInputStream(s.getBytes()));
when(httpResponse.getEntity()).thenReturn(httpEntity);
List<MdmClient> results = xGenericService.getXClient("userId", "surname", "givenName", "postalCode", "availableId", "phoneNumber", "organizationName", "otherKey");
} catch (Exception e) {
e.printStackTrace();
}
}
}
but I am getting following exception
java.lang.IllegalStateException: Target host must not be null, or set in parameters.
at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:784)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:414)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
at au.com.allianz.omnia.service.SafireGenericService.getSafireClient(SafireGenericService.java:87)
at au.com.allianz.omnia.service.SafireGenericServiceTest.testgetSafireClient(SafireGenericServiceTest.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:613)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
Can anybody point me what is wrong with above code?
From the code snippet shared it is evident that HttpClient
and HttpPost
are instantiated via new
operator instead of using any instance level injected (i.e. autowired) objects.
final HttpClient httpClient = new DefaultHttpClient();
final HttpPost postRequest = new HttpPost(someURL);
Thus the @InjectMocks
and @Mock
essentially have no effect and the real instance of HttpClient
and HttpPost
are used when invoked from test class; which explains the error encountered.
In this particular scenario Mockito (perhaps any mocking framework) can't help. To proceed, if possible, refactor the code under test such as to use the instance level injected object(s) instead of using the instance created via new
operator.
来源:https://stackoverflow.com/questions/42102696/mocked-httpclient-calls-actual-method