Como a zombar um servidor web para testes de unidade em Java?
Pergunta
Eu gostaria de criar um teste de unidade usando um servidor web simulada. Existe um servidor web escrito em Java que pode ser facilmente iniciado e interrompido a partir de um caso de teste JUnit?
Solução
Tente simples ( Maven ) é muito fácil de incorporar em um teste de unidade. Leve o RoundTripTest e exemplos como o PostTest escrito com simples. Fornece um exemplo de como incorporar o servidor em seu caso de teste.
Também simples é muito mais leve e mais rápido do Pontão, sem dependências. Então você não terá que adicionar vários arquivos jar em seu classpath. Nem você vai ter que se preocupar com WEB-INF/web.xml
ou quaisquer outros artefatos.
Outras dicas
fio Mock parece oferecer um sólido conjunto de tocos e simulações para testar os serviços web externos.
@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));
}
Pode integrar com Spock também. Exemplo encontrada aqui .
Você está tentando usar um simulada ou um incorporado servidor web ?
Para um simulada servidor web, tente usar Mockito , ou algo semelhante, e apenas zombar dos objetos HttpServletRequest
e HttpServletResponse
como:
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());
Para uma incorporada servidor web, você pode usar Jetty , que você pode em testes .
Você pode escrever um mock com classe HttpServer
do JDK, bem como (dependências nenhuma externos necessário). Consulte este post detalhando como.
Em resumo:
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);
}
Outra boa alternativa seria MockServer ; ele fornece uma interface fluente com o qual você pode definir o comportamento do servidor web zomba.
Você pode tentar Jadler que é uma biblioteca com um fluente programática API Java para stub e zombar http recursos em seus testes. Exemplo:
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");
Se você estiver usando Apache HttpClient, isso vai ser uma boa alternativa. HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
Tente utilizar o Jetty servidor web .
Tenha um olhar em https://github.com/oharsta/priproba