Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Для фиктивного веб-сервера попробуйте использовать 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, которую вы можете использовать в тестах.

Ответ 4

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

В итоге:

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8000), 0); // or use InetSocketAddress(0) for ephemeral port
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); // or put this in an @After method or the like
}

Ответ 5

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

Ответ 6

Вы можете попробовать 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");

Ответ 7

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

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

По сути, вы затем делаете запросы к вашему фиктивному объекту, а затем можете сделать некоторые проверки для него httpClientMock.verify().get("http://localhost/login").withParameter("user","john").called()

Ответ 10

В интересах полноты есть также обтекание причала верблюдом, чтобы сделать его немного более удобным для пользователя.

сделайте ваш тестовый класс расширенным CamelTestSupport, затем определите маршрут, например:

  @Override
  protected RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
      @Override
      public void configure() {
        from("jetty:http://localhost:" + portToUse).process(
                new Processor() {
                  @Override
                  public void process(Exchange exchange) throws Exception {
                    // Get the request information.
                    requestReceivedByServer = (String) exchange.getIn().getHeader(Exchange.HTTP_PATH);

                    // For testing empty response
                    exchange.getOut().setBody("your response");
                    ....

пример зависимостей maven, чтобы получить его:

<dependency> <!-- used at runtime, by camel in the tests -->
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jetty</artifactId>
  <version>2.12.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-core</artifactId>
  <version>2.12.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-test</artifactId>
  <version>2.12.1</version>
  <scope>test</scope>
</dependency>