模拟的 HttpClient 调用实际方法



在我的测试类中,我正在嘲笑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)

任何人都可以指出我上面的代码有什么问题吗?

从共享的代码片段中可以明显看出,HttpClientHttpPost是通过new运算符实例化的,而不是使用任何实例级别注入(即自动连线(的对象。

 final HttpClient httpClient = new DefaultHttpClient();
 final HttpPost postRequest = new HttpPost(someURL);

因此,@InjectMocks@Mock基本上没有效果,从测试类调用时会使用HttpClientHttpPost的真实实例;这解释了遇到的错误。

在这种特殊情况下,Mockito(也许是任何模拟框架(都无济于事。要继续,如果可能,请重构受测代码,例如使用实例级别注入的对象,而不是使用通过new运算符创建的实例。

相关内容

  • 没有找到相关文章

最新更新