2017-02-08 8 views
0

を呼び出して、私は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) 

缶誰でもポイントを取得しています私はやった上記のコードに間違っていますか?コードスニペットから

答えて

1

ではなく注入任意のインスタンス・レベルを使用するnewオペレータを介しHttpClientHttpPostがインスタンス化されることは明らかである共有オブジェクト(すなわちをautowired)。

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

したがって@InjectMocks@Mock本質的に効果とテストクラスから呼び出されたときに使用されHttpClientHttpPostインスタンスを持っていません。遭遇したエラーを説明しています。

この特定のシナリオでは、Mockito(おそらく任意の模擬フレームワーク)は役に立ちません。処理を進めるには、可能であれば、new演算子を使用して作成したインスタンスを使用する代わりに、インスタンスレベルの注入オブジェクトを使用するなど、テスト対象のコードをリファクタリングします。

関連する問題