我想創建一個使用模擬Web服務器的單元測試。是否有用Java編寫的Web服務器,可以通過JUnit測試用例輕鬆啓動和停止?如何在Java中模擬用於單元測試的Web服務器?
27
A
回答
11
4
嘗試使用Jetty web server。
18
您是否在嘗試使用mock or an embedded網絡服務器?
對於模擬 Web服務器,請嘗試使用Mockito,或類似的東西,只是嘲笑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());
對於嵌入式 web服務器,你可以使用Jetty,你可以在use in tests。
1
6
另一個很好的選擇將是MockServer;它提供了一個流暢的界面,您可以使用它來定義模擬Web服務器的行爲。
+0
另外MockServer依賴於Netty(不是Jetty)。 – 2017-10-17 18:39:16
19
Wire Mock似乎提供了一套可靠的存根和嘲笑測試外部Web服務。
@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));
}
它也可以與spock集成。例子發現here。
5
您可以嘗試Jadler(http://jadler.net),它是一個帶有流暢編程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");
4
您也可以使用JDK的HttpServer
類編寫模擬(不需要外部依賴關係)。詳情請見this blog post。
總結:
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);
}
1
如果您使用的是Apache HttpClient的,這將是一個很好的選擇。 HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
全面披露:我是庫的作者。
相關問題
- 1. Rest Java Web服務單元測試/模擬在Java 1.5版本
- 2. 如何在Python單元測試中模擬外部服務器?
- 3. 如何模擬單元測試的服務器重啓任務 - Java?
- 4. 如何在春季單元測試中快速模擬服務?
- 5. 如何在grails服務單元測試中模擬util類
- 6. 如何在grails中單元測試服務時模擬請求
- 7. 使用模擬服務的單元測試篩選器
- 8. 用於測試Web服務的Java庫
- 9. 使用模擬MongoDB服務器進行單元測試
- 10. 如何在多個測試中模擬測試PHPUnit中的Web服務?
- 11. 單元測試Zend控制器模擬模型和服務
- 12. 如何在Grails(Spock)中模擬服務器進行單元測試?
- 13. 用於測試的虛擬服務器
- 14. 在單元測試中模擬AngularJS服務的正確方法?
- 15. 模擬一個Web服務僅用於測試目的
- 16. 用於java單元測試的嵌入式OrientDB服務器
- 17. 在單元測試期間在angular2中模擬定製服務
- 18. 如何將模擬服務注入到過濾器的單元測試中?
- 19. 如何爲單元測試一個服務模擬一個entityManager
- 20. 如何模擬Spring數據和單元測試服務
- 21. angularjs單元測試 - 服務內部模擬服務
- 22. 單元測試EJB 3.1 - 爲什麼模擬容器服務
- 23. 無法單元測試角度控制器與服務模擬
- 24. 如何在Grails單元測試中模擬一個java類?
- 25. 模擬單元測試下的服務類中的方法
- 26. 使用jasmine進行單元測試的模擬angularjs服務
- 27. 單元測試使用AngularFireAuth和模擬的服務authState
- 28. 用於測試服務器的Java Web應用程序
- 29. 模擬SSH服務器用於測試目的
- 30. 如何對使用Web服務的類進行單元測試?
任務看起來更像創建集成測試,而不是單元測試。 – 2016-01-22 20:38:23