2009-03-03 91 views

回答

11

嘗試SimpleMaven)它很容易嵌入到單元測試中。以RoundTripTest和例如用Simple編寫的PostTest爲例。提供如何將服務器嵌入到測試用例中的示例。

另外簡單比Jetty更輕,更快,沒有依賴關係。所以你不必在你的classpath中添加幾個jar。您也不必關心WEB-INF/web.xml或任何其他工件。

+2

雖然它可能是用戶想要的,但它不是一個「模擬」Web服務器,它是在單元測試中啓動的實際Web服務器。例如,如果端口被佔用,它將失敗,所以不是真正的模擬(即,確實對系統有外部依賴)。根據馬丁福勒的命名[「測試雙打」](http://www.martinfowler.com/bliki/TestDouble.html),這是一個「假」。這就是說,它完全是**我正在尋找的東西。 – ArtB 2013-08-21 19:23:47

+0

這個項目失效了嗎? – kbolino 2016-07-13 14:11:44

18

您是否在嘗試使用mock or an embedded網絡服務器?

對於模擬 Web服務器,請嘗試使用Mockito,或類似的東西,只是嘲笑HttpServletRequestHttpServletResponse對象,如:

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

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

+0

這對我來說非常好。使用wireMockConfig()。dynamicPort()使其在其他程序可能使用該端口的設置中更具可預測性。我希望它是默認的,因爲我幾乎錯過了這種可能性,並跳過了這個偉大的圖書館。 – morten 2016-06-17 11:32:56

+0

你提供的代碼中的testClient是什麼? – gribo 2017-06-20 08:22:49

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}"); 

全面披露:我是庫的作者。