Ich möchte einen Komponententest unter Verwendung eines Mock-Webservers erstellen. Gibt es einen in Java geschriebenen Webserver, der einfach von einem JUnit-Testfall gestartet und gestoppt werden kann?Wie spottet man einen Webserver für Komponententests in Java?
Antwort
Versuchen Sie Simple (Maven) es ist sehr einfach in einen Komponententest einzubetten. Nehmen Sie den RoundTripTest und Beispiele wie die PostTest geschrieben mit Simple. Bietet ein Beispiel dafür, wie Sie den Server in Ihren Testfall einbetten können.
Auch einfach ist viel leichter und schneller als Jetty, ohne Abhängigkeiten. Sie müssen also nicht mehrere Gläser zu Ihrem Klassenpfad hinzufügen. Sie werden sich auch nicht mit WEB-INF/web.xml
oder anderen Artefakten befassen müssen.
Obwohl es wahrscheinlich ist, was der Benutzer wollte, ist dies kein "Mock" -Webserver, sondern ein tatsächlicher Webserver, der innerhalb des Komponententests gestartet wird.Zum Beispiel, wenn der Port genommen wurde, würde es fehlschlagen, also kein echter Schein (dh hat eine externe Abhängigkeit vom System). Laut Martin Fowlers Nomenklatur fore ["Test Doubles"] (http://www.martinfowler.com/bliki/TestDouble.html) ist dies ein "Fake". Das heißt, es war genau das, wonach ich suchte. – ArtB
Ist dieses Projekt nicht mehr aktiv? – kbolino
Verwenden Sie die Jetty web server.
Versuchen Sie einen mock or an embedded Webserver zu verwenden?
Für einen Mock Web-Server, versuchen 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 einen Web-Server eingebettet ist, könnten Sie Jetty verwenden, was Sie können use in tests.
Werfen Sie einen Blick auf https://github.com/oharsta/priproba
Eine weitere gute Alternative MockServer wäre; Es bietet eine fließende Oberfläche, mit der Sie das Verhalten des verspotteten Web-Servers definieren können.
Auch der MockServer ist abhängig von Netty (nicht Jetty). –
Wire Mock scheint eine solide Reihe von Stubs und Mocks zum Testen von externen Web-Services bieten.
@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 mit Spock auch integrieren. Beispiel gefunden here.
Das hat sehr gut für mich funktioniert. Verwenden von wireMockConfig(). DynamicPort() macht es vorhersehbarer in einer Einstellung, in der andere Programme den Port verwenden können. Ich wünschte, es wäre der Standard, da ich diese Möglichkeit fast verpasste und diese großartige Bibliothek übersprang. – morten
Was ist testClient in dem von Ihnen bereitgestellten Code? – gribo
@gribo Ich nehme an, testClient ist Ihre tatsächliche Instanz im Test. – Stephan
Sie können versuchen Jadler (http://jadler.net), die eine Bibliothek mit einer fließenden programmatischen Java-API zum Stubeln und Mock-HTTP-Ressourcen in Ihren Tests ist. 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");
Ich versuchte mit Jadler, aber wann immer ich versuche, 'initJadler() 'aufzurufen, bekomme ich den Fehler wie erwähnt https://github.com/jadler-mocking/jadler/issues/107. Irgendwelche Gedanken, was könnte schief gehen? – tuk
Könnten Sie bitte ein Ergebnis von mvn-Abhängigkeit einfügen: Baum hier? Es kann ein Zusammenstoß von Bibliotheken sein. –
Bitte lesen Sie meine Antwort in github.com/jadler-mocking/jadler/issues/107, das Problem wird durch Zusammenstoß von Jetty-Versionen (8 vs 9) verursacht. Sie können entweder die Jetty9-Abhängigkeit entfernen (wenn sie für den Testlauf nicht benötigt wird) oder Jadler ohne Jetty-Abhängigkeit ausführen (https://github.com/jadler-mocking/jadler/wiki/Using-the-Alternative-Stub-Server -Implementation) –
Sie ein Modell mit der auch HttpServer
Klasse JDK schreiben können (keine externen Abhängigkeiten erforderlich). Siehe this blog post Detaillierung wie.
Zusammengefasst:
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);
}
Gibt es eine Möglichkeit zu behaupten, wenn der 'HttpServer' eine Anfrage erhalten hat? –
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}");
vollständige Offenlegung: Ich bin der Autor der Bibliothek.
- 1. Wie spottet man einen Elasticsearch Java Client?
- 2. Wie spottet man eine QML-Komponente?
- 3. Python spottet einen Parameter
- 4. Wie man neues Datum() in Java unter Verwendung Mockito spottet
- 5. AngularJS: Wie spottet man einen in den Geltungsbereich injizierten FormController?
- 6. Wie hostet man vorübergehend einen Webserver für die Offline-Dokumentation?
- 7. Wie spottet man someObj.meth1 (...). Meth2 (...)?
- 8. Wie schreibt man automatisierte Komponententests für Java Annotation Processor?
- 9. Wie spottet man einen Aufruf einer exe-Datei mit Pester?
- 10. Wie spottet man einen IEnumerable <T> richtig?
- 11. Verwendung von toString() für Komponententests in Java
- 12. Komponententests für das Drucken in Java Swing
- 13. Wie spottet man eine private dao-Variable?
- 14. Wie spottet man das Eingabeverzeichnis für meinen Komponententest?
- 15. Wie man mit statischen Methoden spottet?
- 16. Wie spottet man ein geschütztes Feld?
- 17. Wie spottet man eine AJAX-Anfrage?
- 18. Wie spottet man eine Liste der Frühlingsbohnen?
- 19. Wie simuliert man einen CRM-Plugin-Sandbox-Isolationsmodus in Komponententests?
- 20. Wie spottet man ein Kotlin-Singleton-Objekt?
- 21. Wie spottet man ein in den Controller injiziertes Objekt, während man einen Endpunkt in Laravel aufruft?
- 22. Komponententests in Java EE-Umgebung
- 23. Welche Vorteile bietet java.nio für einen Webserver?
- 24. Wie organisiert man Code in Xamarin Forms ViewModel für Komponententests?
- 25. Wie verbinde ich einen Webserver
- 26. Util für einen leichten Webserver unter Linux
- 27. Wie man eine window.location Funktion in Karma/Jasmin spottet
- 28. Muti - Thread-Webserver in Java
- 29. Wie man Controller/Rest-Endpunkte für Komponententests in Play Framework 2.x simuliert [Java]
- 30. Einen Dienst in Komponententests verspotten
Aufgabe sieht eher so aus, als würde ein Integrationstest erstellt, nicht ein Komponententest. –