2016-11-08 2 views
1

Ich versuche Unit-Testfälle für meine HTTP-Client zu schreiben und möchte mit Mockito die Antworten vom Server gespottet werden.Schreiben Mock-Klasse für Java-HTTP-Client

public HttpResponse postRequest(String uri, String body) throws IOException { 
     HttpResponse response; 
     String url = baseUrl + uri; 
     try (CloseableHttpClient httpClient = HttpClientBuilder.create() 
       .build()) { 
      HttpPost post = new HttpPost(url); 
      post.setEntity(new StringEntity(body)); 
      post.setHeader(AUTHORIZATION_HEADER, authorization); 
      post.setHeader(CONTENTTYPE_HEADER, APPLICATION_JSON); 
      post.setHeader(ACCEPT_HEADER, APPLICATION_JSON); 

      response = httpClient.execute(post); 
     } catch (IOException e) { 
      System.out.println("Caught an exception" + e.getMessage().toString()); 
      logger.error("Caught an exception" + e.getMessage().toString()); 
      throw e; 
     } 
     return response; 
    } 

Meine Testklasse ist wie folgt. Ich kann nicht herausfinden, wie ich meine Antwortstelle senden soll.

public class HTTPRequestTest extends Mockito { 
    private String body = "{a:b}"; 

    @Test 
    public void xyz throws Exception { 
     HttpClient httpClient = mock(HttpClient.class); 
     HttpPost httpPost = mock(HttpPost.class); 
     HttpResponse httpResponse = mock(HttpResponse.class); 
     StatusLine statusLine = mock(StatusLine.class); 

     when(httpClient.execute(httpPost)).thenReturn(body); 
    } 
} 

Antwort

0

Das Problem ist, dass Ihr HttpClient Mock nicht in Ihrem Komponententest verwendet wird.

Ihre postRequest Funktion erstellt eine neue Httpclient mit dieser Methode:

HttpClientBuilder.create().build() 

HttpClientBuilder instanziiert ein neues Httpclient, die eine völlig separate Instanz von Httpclient als die mock Sie in Ihrem Unit-Test schaffen. Leider gibt es keine einfache Möglichkeit, Ihren Code wie geschrieben zu testen, da Mockito statische Methoden nicht vortäuschen kann (wie HttpClientBuilder.create). Weitere Informationen zu diesem Problem und möglichen Problemumgehungen finden Sie unter this post.

Um diesen Beitrag zusammenzufassen, sind Ihre Optionen, entweder Ihren Code neu zu schreiben, so dass Sie einen Mock leichter injizieren können, oder wechseln Sie zu einem Mock Framework, die statischen Methoden (wie PowerMock) Mock Spott.

3

Mit PowerMockito: zuerst Ihre Testklasse

@RunWith (PowerMockRunner.class)

@PrepareForTest (HttpClientBuilder.class)

dann Ihren Test mit Anmerkungen versehen Methode kann etwas sein wie: