web-dev-qa-db-ja.com

MockRestServiceServerは、統合テストでバックエンドタイムアウトをシミュレートします

私はRESTコントローラーでMockRestServiceServerを使用してバックエンドの動作をモックする何らかの統合テストを書いています。今私が達成しようとしているのは、バックエンドからの非常に遅い応答をシミュレートすることです。私のアプリケーション。WireMockで実装できるようですが、現時点ではMockRestServiceServerに固執したいと思います。

私はこのようなサーバーを作成しています:

myMock = MockRestServiceServer.createServer(asyncRestTemplate);

そして、次のようなバックエンドの動作をモックしています。

myMock.expect(requestTo("http://myfakeurl.blabla"))
            .andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess(myJsonResponse, MediaType.APPLICATION_JSON));

応答(またはモックされたサーバー全体、あるいは私のasyncRestTemplate)に、ある種の遅延やタイムアウト、または他の種類の待ち時間を追加することは可能ですか?それとも、WireMockまたはRestitoに切り替える必要がありますか?

13
dune76

このテスト機能は次のように実装できます(Java 8)。

myMock
    .expect(requestTo("http://myfakeurl.blabla"))
    .andExpect(method(HttpMethod.GET))
    .andRespond(request -> {
        try {
            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        } catch (InterruptedException ignored) {}
        return new MockClientHttpResponse(myJsonResponse, HttpStatus.OK);
    });

ただし、MockRestServiceServerはRestTemplate requestFactoryを置き換えるだけなので、作成したrequestFactory設定はテスト環境で失われることに注意してください。

9
Skeeve

実行できるアプローチ:クラスパスリソースまたは通常の文字列コンテンツのいずれかを使用して応答本体を指定します。 Skeeveが上で提案したもののより詳細なバージョン

.andRespond(request -> {
            try {
                Thread.sleep(TimeUnit.SECONDS.toMillis(5)); // Delay
            } catch (InterruptedException ignored) {}
            return withStatus(OK).body(responseBody).contentType(MediaType.APPLICATION_JSON).createResponse(request);
        });
2
Pratik Kotadia

Restito には、タイムアウトをシミュレートする組み込み関数があります。

import static com.xebialabs.restito.semantics.Action.delay

whenHttp(server).
   match(get("/something")).
   then(delay(201), stringContent("{}"))
1
Lewy

一般に、カスタムリクエストハンドラーを定義して、そこで厄介なThread.sleep()を実行できます。

これは Restito でこのようなもので可能になります。

Action waitSomeTime = Action.custom(input -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return input;
});

whenHttp(server).match(get("/asd"))
        .then(waitSomeTime, ok(), stringContent("Hello World"))

ただし、Springについては不明です。簡単に試すことができます。インスピレーションを得るために DefaultResponseCreator を確認してください。

0
Sotomajor

Httpクライアントでタイムアウトを制御し、たとえば1秒を使用する場合は、 モックサーバー遅延 を使用できます。

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path")
)
.respond(
    response()
        .withBody("some_response_body")
        .withDelay(TimeUnit.SECONDS, 10)
);

モックサーバーで接続を切断したい場合は、 モックサーバーエラーアクション を使用します。

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path")
)
.error(
    error()
        .withDropConnection(true)
);
0
makson