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

StackOverflow https://stackoverflow.com/questions/606352

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

Проволочный Макет похоже, предлагает солидный набор заглушек и макетов для тестирования внешних веб-сервисов.

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

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

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

Для издеваться веб-сервер, попробуйте использовать Мокито, или что-то подобное, и просто издеваться над 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());

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

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

Подводя итог:

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

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

Ты можешь попробовать Джадлер это библиотека с свободно используемым программным 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");

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

HttpClientMock httpClientMock = new httpClientMock() 
HttpClientMock("http://example.com:8080"); 
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");

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

Взгляните на https://github.com/oharsta/priproba

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top