Я хотел бы создать unit test, используя макет веб-сервера. Есть ли веб-сервер, написанный на Java, который можно легко запустить и остановить из тестового примера JUnit?
Как издеваться над веб-сервером для модульного тестирования на Java?
Ответ 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()
Ответ 8
Попробуйте использовать веб-сервер Jetty.
Ответ 9
Посмотрите https://github.com/oharsta/priproba
Ответ 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>