Как создать макет веб-сервера для модульного тестирования на Java?
Вопрос
Я хотел бы создать модульный тест, используя макет веб-сервера.Существует ли веб-сервер, написанный на 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