我想创建一个使用模拟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. 如何在grails中单元测试服务时模拟请求
- 5. 如何在grails服务单元测试中模拟util类
- 6. 使用模拟服务的单元测试筛选器
- 7. 使用模拟MongoDB服务器进行单元测试
- 8. 单元测试Zend控制器模拟模型和服务
- 9. 如何在多个测试中模拟测试PHPUnit中的Web服务?
- 10. 用于测试的虚拟服务器
- 11. 模拟一个Web服务仅用于测试目的
- 12. 如何将模拟服务注入到过滤器的单元测试中?
- 13. 如何为单元测试一个服务模拟一个entityManager
- 14. 单元测试EJB 3.1 - 为什么模拟容器服务
- 15. 无法单元测试角度控制器与服务模拟
- 16. 模拟单元测试下的服务类中的方法
- 17. 单元测试使用AngularFireAuth和模拟的服务authState
- 18. 用于测试服务器的Java Web应用程序
- 19. 模拟SSH服务器用于测试目的
- 20. Angular2单元测试不使用模拟服务
- 21. 在单元测试下可以模拟android服务吗?
- 22. 单元测试如何模拟Cookie
- 23. 单元测试Web服务 - HttpContext
- 24. C#Web服务单元测试
- 25. 单元测试JAX-WS Web服务?
- 26. 单元测试JAX-RS Web服务?
- 27. 如何在Java中使用WSDL生成模拟Web服务?
- 28. 单元测试模拟HttpActionContext
- 29. 单元测试模拟Url.Action
- 30. CakePHP单元测试模拟控制器
任务看起来更像创建集成测试,而不是单元测试。 – 2016-01-22 20:38:23