2016-11-08 12 views
1

我正在嘗試爲我的HTTP客戶機編寫單元測試用例,並且想使用mockito來模擬從服務器接收到的響應。爲java http客戶機寫入模擬類

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

我的測試類如下。我無法弄清楚我應該如何發送我的答覆機構。

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

回答

0

問題是您的HttpClient模擬沒有在您的單元測試中使用。

你postRequest功能使用此方法創建一個新的HttpClient:

HttpClientBuilder.create().build() 

HttpClientBuilder實例化一個新的HttpClient,這是HttpClient的比你在你的單元測試創​​建模擬一個完全獨立的實例。不幸的是,沒有簡單的方法來測試你寫的代碼,因爲Mockito不能模擬靜態方法(比如HttpClientBuilder.create)。有關此問題和可能的解決方法的更多討論,請參閱this post。總結那篇文章,你的選擇是重寫你的代碼,這樣你可以更容易地注入一個模擬,或者切換到模擬靜態方法的模擬框架(如PowerMock)。

3

使用PowerMockito: 先給相應的測試類

@RunWith(PowerMockRunner.class)

@PrepareForTest(HttpClientBuilder.class)

那麼你的測試方法是這樣的:

@Test 
public void xyz() throws Exception { 
    HttpClientBuilder mockClientBuilder = PowerMockito.mock(HttpClientBuilder.class); 
    CloseableHttpClient mockHttpClient = PowerMockito.mock(CloseableHttpClient.class); 
    CloseableHttpResponse mockResponse = PowerMockito.mock(CloseableHttpResponse.class); 
    PowerMockito.mockStatic(HttpClientBuilder.class); 

    PowerMockito.when(HttpClientBuilder.class, "create").thenReturn(mockClientBuilder); 
    PowerMockito.when(mockClientBuilder.build()).thenReturn(mockHttpClient); 
    PowerMockito.when(mockHttpClient.execute(any(HttpPost.class))).thenReturn(mockResponse); 

    HttpResponse response = classUnderTest.postRequest("uri", "body"); 
    //assertResponse 
}