Как издеваться над веб-сервером для модульного тестирования в Java? - PullRequest
37 голосов
/ 03 марта 2009

Я хотел бы создать модульный тест, используя фиктивный веб-сервер. Существует ли веб-сервер, написанный на Java, который можно легко запустить и остановить из тестового примера JUnit?

Ответы [ 9 ]

28 голосов
/ 12 февраля 2015

Wire Mock предлагает полный набор заглушек и макетов для тестирования внешних веб-сервисов.

@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);


@Test
public void exactUrlOnly() {
    stubFor(get(urlEqualTo("/some/thing"))
            .willReturn(aResponse()
                .withHeader("Content-Type", "text/plain")
                .withBody("Hello world!")));

    assertThat(testClient.get("/some/thing").statusCode(), is(200));
    assertThat(testClient.get("/some/thing/else").statusCode(), is(404));
}

Может также интегрироваться со споком. Пример найден здесь .

20 голосов
/ 03 марта 2009

Вы пытаетесь использовать макет или встроенный веб-сервер?

Для веб-сервера mock попробуйте использовать Mockito или что-то подобное, и просто смоделируйте объекты HttpServletRequest и HttpServletResponse, например:

MyServlet servlet = new MyServlet();
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
HttpServletResponse mockResponse = mock(HttpServletResponse.class);

StringWriter out = new StringWriter();
PrintWriter printOut = new PrintWriter(out);
when(mockResponse.getWriter()).thenReturn(printOut);

servlet.doGet(mockRequest, mockResponse);

verify(mockResponse).setStatus(200);
assertEquals("my content", out.toString());

Для встроенного веб-сервера вы можете использовать Jetty , который вы можете использовать в тестах .

13 голосов
/ 03 марта 2009

Попробуйте Простой ( Maven ) его очень легко внедрить в модульный тест. Возьмите RoundTripTest и примеры, такие как PostTest , написанные с помощью Simple. Предоставляет пример того, как встроить сервер в ваш тестовый пример.

Кроме того, Simple намного легче и быстрее, чем Jetty, без каких-либо зависимостей. Таким образом, вам не нужно добавлять несколько банок на ваш путь к классам. Вам также не придется беспокоиться о WEB-INF/web.xml или любых других артефактах.

9 голосов
/ 01 марта 2017

Вы также можете написать макет с помощью класса HttpServer JDK (внешние зависимости не требуются). См. это сообщение в блоге , подробно описывающее, как.

В итоге:

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8000), 0);
httpServer.createContext("/api/endpoint", new HttpHandler() {
   public void handle(HttpExchange exchange) throws IOException {
      byte[] response = "{\"success\": true}".getBytes();
      exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
      exchange.getResponseBody().write(response);
      exchange.close();
   }
});
httpServer.start();

try {
// Do your work...
} finally {
   httpServer.stop(0);
}
7 голосов
/ 13 ноября 2014

Другой хорошей альтернативой будет MockServer ; он обеспечивает свободный интерфейс, с помощью которого вы можете определить поведение максифицированного веб-сервера.

6 голосов
/ 22 января 2016

Вы можете попробовать Jadler , которая является библиотекой с быстрым программным Java API, чтобы заглушить и смоделировать ресурсы http в ваших тестах. Пример:

onRequest()
    .havingMethodEqualTo("GET")
    .havingPathEqualTo("/accounts/1")
    .havingBody(isEmptyOrNullString())
    .havingHeaderEqualTo("Accept", "application/json")
.respond()
    .withDelay(2, SECONDS)
    .withStatus(200)
    .withBody("{\\"account\\":{\\"id\\" : 1}}")
    .withEncoding(Charset.forName("UTF-8"))
    .withContentType("application/json; charset=UTF-8");
5 голосов
/ 10 января 2018

Если вы используете apache HttpClient, это будет хорошей альтернативой. HttpClientMock

HttpClientMock httpClientMock = new httpClientMock() 
HttpClientMock("http://example.com:8080"); 
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
3 голосов
/ 03 марта 2009

Попробуйте использовать Jetty веб-сервер .

0 голосов
/ 21 декабря 2010

Посмотрите на https://github.com/oharsta/priproba

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...