web-dev-qa-db-ja.com

Javaで単体テストのためにWebサーバーをモックする方法は?

モックWebサーバーを使用して単体テストを作成したいと思います。 Javaで記述され、JUnitテストケースから簡単に起動および停止できるWebサーバーはありますか?

38
jon077

SimpleMaven )を試してみてください。非常に簡単に単体テストに組み込むことができます。 RoundTripTestと、Simpleで記述された PostTest などの例を取り上げます。サーバーをテストケースに埋め込む方法の例を示します。

また、SimpleはJettyよりもはるかに軽量で高速であり、依存関係はありません。したがって、いくつかのjarファイルをクラスパスに追加する必要はありません。また、WEB-INF/web.xmlやその他のアーティファクトを気にする必要もありません。

13
ng.

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

スポックとも統合できます。例が見つかりました here

30
keaplogik

mockまたはembeddedを使用しようとしていますか? Webサーバー?

mockWebサーバーの場合、 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());

embeddedWebサーバーの場合、 Jetty を使用できます。これは testで使用 です。

20
CoverosGene

JDKのHttpServerクラスを使用してモックを作成することもできます(外部依存関係は不要です)。 このブログ投稿 方法の詳細を参照してください。

要約すれば:

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);
}
11
jkschneider

もう1つの優れた代替手段は MockServer ;です。模擬Webサーバーの動作を定義できる滑らかなインターフェイスを提供します。

7
Haroldo_OK

Jadler を試すことができます。これは、テストでhttpリソースをスタブおよびモックするAPIを流にプログラムするJavaのライブラリです。例:

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");
6
Jan Dudek

Apache HttpClientを使用している場合、これは適切な代替手段になります。 HttpClientMock

HttpClientMock httpClientMock = new httpClientMock() 
HttpClientMock("http://example.com:8080"); 
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
5
s-han.lee

Jetty Webサーバー を使用してみてください。

3
flybywire
0
Okke Harsta