2009-03-03 52 views

Trả lời

11

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.

+2

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

+0

Dự án này có tồn tại không? – kbolino

18

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 HttpServletRequestHttpServletResponse đố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.

6

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ả.

+0

Ngoài ra MockServer còn phụ thuộc vào Netty (không phải Jetty). –

19

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.

+0

Đ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

+0

TestClient trong mã bạn cung cấp là gì? – gribo

+0

@gribo Tôi cho rằng testClient là cá thể thực tế của bạn đang được kiểm tra. – Stephan

5

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"); 
+0

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

+0

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. –

+1

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) –

4

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); 
} 
+0

Có cách nào để khẳng định nếu 'HttpServer' nhận được yêu cầu không? –

1

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.

Các vấn đề liên quan