2017-02-08 5 views
0

In meinem Test-Klasse-I Httpclient bin spöttisch, aber wenn ich Testklasse laufen nennt es tatsächliche Methode statt spotten LinieHttpclient ruft tatsächliche Methode

final HttpResponse response = httpClient.execute(postRequest); 

und gibt mir java.lang.IllegalStateException.

Hier ist mein 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()))); 

und hier ist mein Test-Klassencode

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(); 
    } 

    } 

}

aber ich bin immer folgende Ausnahme

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) 

kann jeder Punkt ich wha t ist falsch mit obigen Code?

Antwort

1

aus dem Code-Schnipsel geteilt ist es offensichtlich, dass HttpClient und HttpPost über new Operator instanziiert werden anstelle jede Instanzebene des Verwendens injiziert (d.h. autowired) Objekte.

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

So ist die @InjectMocks@Mock und haben im Wesentlichen keine Wirkung und die realen Instanz HttpClient und HttpPost verwendet werden, wenn aus Testklasse aufgerufen; Das erklärt den aufgetretenen Fehler.

In diesem speziellen Szenario kann Mockito (vielleicht kein Spott Framework) nicht helfen. Wenn möglich, refactorieren Sie den getesteten Code so, dass Sie die injizierten Objekte auf Instanzebene verwenden, anstatt die über den Operator new erstellte Instanz zu verwenden.

Verwandte Themen