2016-11-08 37 views
1

私はHTTPクライアント用のユニットテストケースを作成しようとしていますが、mockitoを使用してサーバから受け取ったレスポンスを模擬したいと考えています。java httpクライアント用のMockクラスの作成

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など)に切り替えることができます。 PowerMockitoを使用して

3

: まず

@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 
} 
関連する問題