在我的测试类中,我正在嘲笑HTTPclient,但是当我运行测试类时,它调用实际方法而不是在行模拟
final HttpResponse response = httpClient.execute(postRequest);
并给了我java.lang.IllegalStateException。
这是我的代码
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())));
这是我的测试类代码
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();
}
}
}
但我得到以下异常
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)
任何人都可以指出我上面的代码有什么问题吗?
从共享的代码片段中可以明显看出,HttpClient
和HttpPost
是通过new
运算符实例化的,而不是使用任何实例级别注入(即自动连线(的对象。
final HttpClient httpClient = new DefaultHttpClient();
final HttpPost postRequest = new HttpPost(someURL);
因此,@InjectMocks
和@Mock
基本上没有效果,从测试类调用时会使用HttpClient
和HttpPost
的真实实例;这解释了遇到的错误。
在这种特殊情况下,Mockito(也许是任何模拟框架(都无济于事。要继续,如果可能,请重构受测代码,例如使用实例级别注入的对象,而不是使用通过new
运算符创建的实例。