Wie man einen Web-Server für Unit-Tests in Java verspotten?
Frage
Ich mag einen Unit-Test erstellen ein Mock-Webserver verwenden. Gibt es einen Web-Server in Java geschrieben, die leicht gestartet und gestoppt von einem JUnit-Testfall werden können?
Lösung
Versuchen Sie Einfache ( Maven ) ist es sehr einfach in einen Komponententest einzubetten. Nehmen Sie die RoundTripTest und Beispiele wie die Posttest mit einfachen geschrieben. Bietet ein Beispiel, wie Sie den Server in Ihren Testfall einbinden.
Auch Einfach ist viel leichter und schneller als Jetty, ohne Abhängigkeiten. So werden Sie nicht mehr JAR-Dateien auf Ihren Classpath hinzufügen. Auch müssen Sie mit WEB-INF/web.xml
oder anderen Artefakte betroffen sein.
Andere Tipps
Draht Mock scheint eine solide Reihe von Stubs zu bieten und spottet zum Testen externen Web-Service.
@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));
}
Es kann auch mit spock integrieren. Beispiel gefunden hier .
Versuchen Sie, eine Mock oder eingebettet Webserver?
Für eine Mock Web-Server, versuchen Sie es mit Mockito , oder etwas ähnliches, und verspotten nur die HttpServletRequest
und HttpServletResponse
Objekte wie:
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());
Für eine eingebettet Web-Server, können Sie Jetty verwenden, die Sie können verwenden rel="noreferrer">.
Sie können ein Modell mit der HttpServer
Klasse JDK schreiben als auch (keine externen Abhängigkeiten erforderlich). Siehe diese Blog-Post beschreibt, wie.
Zusammenfassung:
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);
}
Eine weitere gute Alternative wäre MockServer ; es bietet eine fließend Schnittstelle, mit der Sie das Verhalten des verspottete Webserver definieren können.
Sie können versuchen, Jadler , die eine Bibliothek mit einer fließend programmatische Java API ist zu Stummel und Mock http Ressourcen in Ihren Tests. Beispiel:
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");
Wenn Sie Apache Httpclient verwenden, Das wird eine gute Alternative sein. HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
Versuchen Sie, die Jetty Webserver verwendet wird.
Hier finden Sie aktuelle https://github.com/oharsta/priproba