Tôi muốn tạo thử nghiệm đơn vị bằng máy chủ web giả. Có một máy chủ web được viết bằng Java có thể dễ dàng bắt đầu và dừng lại từ một trường hợp kiểm tra JUnit không?Làm thế nào để thử một máy chủ web để thử nghiệm đơn vị trong Java?
Trả lời
Hãy thử Simple (Maven) rất dễ dàng để nhúng vào thử nghiệm đơn vị. Lấy RoundTripTest và các ví dụ như là PostTest được viết bằng Simple. Cung cấp ví dụ về cách nhúng máy chủ vào trường hợp thử nghiệm của bạn.
Ngoài ra, Đơn giản hơn nhiều và nhanh hơn Cầu tàu, không có phụ thuộc. Vì vậy, bạn sẽ không phải thêm một số lọ vào classpath của bạn. Bạn cũng sẽ không phải quan tâm đến WEB-INF/web.xml
hoặc bất kỳ hiện vật nào khác.
Trong khi đó có lẽ là những gì người dùng muốn, đây không phải là một máy chủ web "giả" nó là một máy chủ web thực tế được đưa ra trong thử nghiệm đơn vị.Ví dụ, nếu cổng đã được thực hiện nó sẽ thất bại, do đó, không phải là một giả thực sự (tức là không có một phụ thuộc bên ngoài từ hệ thống). Theo danh pháp của Martin Fowler, ["Test Doubles"] (http://www.martinfowler.com/bliki/TestDouble.html), đây là một "giả". Điều đó nói rằng, nó đã được ** chính xác ** những gì tôi đang tìm kiếm. – ArtB
Dự án này có tồn tại không? – kbolino
Thử sử dụng Jetty web server.
Bạn đang cố gắng sử dụng máy chủ web mock or an embedded?
Đối với một máy chủ web giả, hãy thử sử dụng Mockito, hoặc một cái gì đó tương tự, và chỉ nhạo báng các HttpServletRequest
và HttpServletResponse
đối tượng như:
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());
Đối với một máy chủ web nhúng, bạn có thể sử dụng Jetty, mà bạn có thể use in tests.
Có một cái nhìn tại https://github.com/oharsta/priproba
Một lựa chọn tốt sẽ MockServer; nó cung cấp một giao diện thông thạo mà bạn có thể xác định hành vi của máy chủ web giả.
Ngoài ra MockServer còn phụ thuộc vào Netty (không phải Jetty). –
Wire Mock dường như cung cấp một bộ sơ khai vững chắc và mocks để thử nghiệm các dịch vụ web bên ngoài.
@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));
}
Nó cũng có thể tích hợp với spock. Ví dụ: here.
Điều này làm việc rất tốt cho tôi. Sử dụng wireMockConfig(). DynamicPort() làm cho nó dễ dự đoán hơn trong một thiết lập nơi các chương trình khác có thể sử dụng cổng. Tôi ước nó là mặc định vì tôi gần như bỏ lỡ khả năng này và bỏ qua thư viện tuyệt vời này. – morten
TestClient trong mã bạn cung cấp là gì? – gribo
@gribo Tôi cho rằng testClient là cá thể thực tế của bạn đang được kiểm tra. – Stephan
Bạn có thể thử Jadler (http://jadler.net) là thư viện có API Java có lập trình thông thạo để khai thác và thử tài nguyên http trong bài kiểm tra của bạn. Ví dụ:
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");
Tôi đã thử sử dụng Jadler nhưng bất cứ khi nào tôi cố gắng gọi 'initJadler()' Tôi nhận được lỗi như đã đề cập https://github.com/jadler-mocking/jadler/issues/107. Có suy nghĩ gì có thể xảy ra không? – tuk
Bạn có thể dán kết quả của phụ thuộc mvn: cây ở đây không? Nó có thể là một cuộc đụng độ của các thư viện. –
Vui lòng đọc câu trả lời của tôi trong github.com/jadler-mocking/jadler/issues/107, vấn đề là do xung đột các phiên bản Jetty (8 so với 9). Bạn có thể loại bỏ sự phụ thuộc Jetty9 (nếu nó không cần thiết cho chạy thử nghiệm) hoặc chạy Jadler mà không có sự phụ thuộc Jetty (https://github.com/jadler-mocking/jadler/wiki/Using-the-Alternative-Stub-Server -Thực hiện) –
Bạn cũng có thể viết mô hình với lớp JDK HttpServer
(không cần phụ thuộc bên ngoài). Xem this blog post chi tiết cách thức.
Nói tóm lại:
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ó cách nào để khẳng định nếu 'HttpServer' nhận được yêu cầu không? –
Nếu bạn đang sử dụng apache HttpClient, Đây sẽ là một lựa chọn tốt. HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
ĐẦY ĐỦ CÔNG BỐ: Tôi là tác giả của thư viện.
- 1. Chủ đề thử nghiệm đơn vị?
- 2. Thử nghiệm đơn vị dịch vụ web
- 3. Làm cách nào để lấy tên phương thức thử nghiệm đơn vị khi chạy trong thử nghiệm đơn vị?
- 4. Máy chủ Web để thử nghiệm trên Linux
- 5. đơn vị thử nghiệm một phương pháp nhà máy
- 6. Thử nghiệm Đơn vị XNA
- 7. Máy chủ SQL để thử nghiệm trên web
- 8. mùi thử nghiệm đơn vị
- 9. Máy chủ X giả để thử nghiệm?
- 10. Icefaces thử nghiệm đơn vị
- 11. Thử nghiệm đơn vị thử nghiệm Javascript Sandbox
- 12. Thử nghiệm đơn vị trong CakePHP?
- 13. Làm cách nào để thực hiện một thử nghiệm đơn lẻ bằng thử nghiệm/đơn vị Ruby?
- 14. Thử nghiệm đơn vị sau khi thử nghiệm
- 15. Làm thế nào để thử một yêu cầu khi đơn vị thử nghiệm một dịch vụ trong grails
- 16. Đơn vị thử nghiệm Dịch vụ Web JAX-RS?
- 17. Thử nghiệm đơn vị trên Android NDK
- 18. Thử nghiệm đơn vị trong Ember.js
- 19. Làm thế nào để đăng nhập lỗi, tin nhắn trong một thử nghiệm đơn vị NUnit?
- 20. Làm thế nào để thiết lập một thử nghiệm đơn vị trong VBA Excel Macro?
- 21. Thử nghiệm đơn vị với số đơn
- 22. Tắt máy phát điện thử nghiệm đơn vị trong Rails
- 23. Thử nghiệm dương tính và thử nghiệm âm tính trong thử nghiệm đơn vị
- 24. Thử nghiệm đơn vị với Spring Security
- 25. TDD: Có hợp lý để thử nghiệm tích hợp, nhưng không có thử nghiệm đơn vị?
- 26. Nondeterminism trong thử nghiệm đơn vị
- 27. Làm thế nào để tiêm PersistenceContext trong thử nghiệm đơn vị?
- 28. plugins maven thử nghiệm đơn vị
- 29. thử nghiệm đơn vị mô-đun javascript
- 30. Thử nghiệm đơn vị với Oracle
Nhiệm vụ trông giống như tạo kiểm tra tích hợp chứ không phải thử nghiệm đơn vị. –