Vorrei creare un test unitario utilizzando un server Web fittizio. C'è un server web scritto in Java che può essere facilmente avviato e fermato da un caso di test JUnit?Come schernire un server Web per il test delle unità in Java?
risposta
Provare (Maven) è molto facile da incorporare in un test di unità. Prendi RoundTripTest ed esempi come PostTest scritto con Simple. Fornisce un esempio di come incorporare il server nel tuo caso di test.
Anche Simple è molto più leggero e veloce di Jetty, senza dipendenze. Quindi non dovrai aggiungere diversi jar al tuo classpath. Né dovrai preoccuparti di WEB-INF/web.xml
o di altri artefatti.
Anche se probabilmente è ciò che l'utente desiderava, questo non è un server Web "fittizio", è un vero server web che viene lanciato all'interno del test dell'unità.Ad esempio, se la porta è stata presa, fallirebbe, quindi non un vero finto (cioè ha una dipendenza esterna dal sistema). Secondo la nomenclatura di Martin Fowler fore ["Test Doubles"] (http://www.martinfowler.com/bliki/TestDouble.html), questo è un "falso". Detto questo, era ** esattamente ** quello che stavo cercando. – ArtB
Questo progetto è andato a finire? – kbolino
Provare a utilizzare Jetty web server.
Si sta tentando di utilizzare un server Web mock or an embedded?
Per un web server finta, provare a utilizzare Mockito, o qualcosa di simile, e solo deridere il HttpServletRequest
e HttpServletResponse
oggetti come:
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());
Per un server web incorporato, è possibile utilizzare Jetty, che puoi use in tests.
Dai un'occhiata alla https://github.com/oharsta/priproba
Un'altra buona alternativa potrebbe essere MockServer; fornisce un'interfaccia fluente con la quale è possibile definire il comportamento del server Web deriso.
Anche il MockServer dipende da Netty (non da Jetty). –
Wire Mock sembra offrire un solido insieme di matrici e mock per testare servizi web esterni.
@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));
}
Può essere integrato anche con Spock. Esempio trovato here.
Questo ha funzionato molto bene per me. L'uso di wireMockConfig(). DynamicPort() rende più prevedibile un'impostazione in cui altri programmi potrebbero utilizzare la porta. Vorrei che fosse l'impostazione predefinita in quanto mi mancava quasi questa possibilità e ho saltato questa fantastica libreria. – morten
Che cos'è testClient nel codice che hai fornito? – gribo
@gribo Suppongo che testClient sia la tua istanza attuale sotto test. – Stephan
Puoi provare Jadler (http://jadler.net) che è una libreria con un'API Java programmatica fluida per bloccare e simulare le risorse http nei test. Esempio:
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");
Ho provato ad usare Jadler ma ogni volta che provo a chiamare 'initJadler()' sto ricevendo l'errore come menzionato https://github.com/jadler-mocking/jadler/issues/107. Qualche idea di cosa potrebbe andare storto? – tuk
Potresti incollare un risultato della dipendenza da mvn: albero qui? Potrebbe essere uno scontro di librerie. –
Si prega di leggere la mia risposta in github.com/jadler-mocking/jadler/issues/107, il problema è causato dal conflitto di versioni di Jetty (8 vs 9). Puoi rimuovere la dipendenza di Jetty9 (se non è necessaria per l'esecuzione di test) o eseguire Jadler senza la dipendenza da Jetty (https://github.com/jadler-mocking/jadler/wiki/Using-the-Alternative-Stub-Server -Implementazione) –
è possibile scrivere un mock con classe del JDK HttpServer
così (senza dipendenze esterne richiesti). Vedi this blog post che spiega come.
In sintesi:
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);
}
C'è un modo per affermare se il 'HttpServer' ha ricevuto una richiesta? –
Se si utilizza Apache HttpClient, questa sarà una buona alternativa. HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
Full Disclosure: Io sono l'autore della biblioteca.
- 1. Server HTTP per i test delle unità in Delphi
- 2. Test delle unità in PHP?
- 3. Il miglior strumento per il test delle unità in MySQL
- 4. Disabilita il timeout per i test delle unità in C#
- 5. Global.asax per i test delle unità?
- 6. Codice unità client di test delle unità di gestione
- 7. Il test delle unità è meraviglioso, ma
- 8. Test delle unità Android delle categorie
- 9. Logica basata sul tempo di test delle unità in Java
- 10. Test delle unità per progetti iOS
- 11. SpecFlow/BDD per i test delle unità?
- 12. SQL Server per il test sul web
- 13. Test delle unità richieste HTTP in C#
- 14. Come test delle unità Retrofit api chiama
- 15. Come prendere in giro python's datetime.now() in un metodo di classe per il test delle unità?
- 16. Strumento di test delle unità per il database Sybase
- 17. Test delle unità Classi astratte in Groovy
- 18. iPhone - Recupero delle risorse per i test delle unità logiche
- 19. Buona libreria java per confrontare i file xml per il test delle unità?
- 20. Test delle migliori pratiche (unità) Windows Azure
- 21. Come eseguire il debug dei test delle unità Django?
- 22. Come si eseguono i test delle unità javascript in Maven, senza la necessità di eseguire un browser o un server?
- 23. "Test unità" un report
- 24. Test delle unità/test di integrazione API Web con HttpClient in Visual Studio 2013
- 25. Come eseguire il server jetty per il test java junit
- 26. Utilizzo delle informazioni sulle applicazioni con i test delle unità?
- 27. Test unità - stubing un SqlDataReader
- 28. Test unità MVC con server ASP.NET Dev
- 29. Test delle unità Clojure al volo in un frame separato
- 30. Test unità Test delle applicazioni .NET basate su database
L'attività sembra più la creazione di test di integrazione, non un test di unità. –