2016-11-08 4 views
1

Я пытаюсь написать блок-тесты для моего HTTP-клиента и хотел бы использовать mockito для издевательства ответов, полученных от сервера.Написание класса Mock для HTTP-клиента java

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 
} 
Смежные вопросы