MockServerの紹介

1概要

MockServer は、外部のHTTP APIをモック/スタブするためのツールです。

2 Mavenの依存関係

アプリケーションで MockServer を利用するには、2つの依存関係を追加する必要があります。

<dependency>
    <groupId>org.mock-server</groupId>
    <artifactId>mockserver-netty</artifactId>
    <version>3.10.8</version>
</dependency>
<dependency>
    <groupId>org.mock-server</groupId>
    <artifactId>mockserver-client-java</artifactId>
    <version>3.10.8</version>
</dependency>

依存関係の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.mock-server%22%20%20a%3A%22mockserver-netty%として入手可能です。 22[mockserver-netty]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.mock-server%22%20%20a%3A%22mockserver-client-java% 22[モックサーバ - クライアント]

3 MockServer 機能

簡単に言えば、このツールは次のことができます。

  • 固定応答を生成して返す

  • リクエストを他のサーバーに転送する

  • コールバックを実行する

  • リクエストを確認する

4 MockServer の実行方法

いくつかの方法でサーバーを起動できます - これらの方法のいくつかを探りましょう。

4.1. Mavenプラグインを介した起動

これは、 process-test-class フェーズ中にサーバーを起動し、 verify フェーズで停止します。

<plugin>
    <groupId>org.mock-server</groupId>
    <artifactId>mockserver-maven-plugin</artifactId>
    <version>3.10.8</version>
    <configuration>
        <serverPort>1080</serverPort>
        <proxyPort>1090</proxyPort>
        <logLevel>DEBUG</logLevel>
        <initializationClass>org.mockserver.maven.ExampleInitializationClass</initializationClass>
    </configuration>
    <executions>
        <execution>
            <id>process-test-classes</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>start</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <phase>verify</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4.2. Java APIを介した起動

サーバーを起動するには、 startClientAndServer() Java APIを使用できます。

通常、すべてのテストを実行する前にサーバーを起動します。

public class TestMockServer {

    private ClientAndServer mockServer;

    @BeforeClass
    public void startServer() {
        mockServer = startClientAndServer(1080);
    }

    @AfterClass
    public void stopServer() {
        mockServer.stop();
    }

   //...
}

5モッククライアント

MockServerClient APIは、 MockServerに接続する機能を提供するために使用されます。 MockServerClient__は、要求とサーバーからの対応する応答をモデル化します。

複数の操作をサポートしています。

5.1. モックレスポンスで期待値を作成する

期待値は、クライアントからの要求とMockServerからの応答を偽造するためのメカニズムです。

期待値を作成するには、リクエストマッチャーと返されるレスポンスを定義する必要があります。

リクエストは以下を使用して一致させることができます。

  • path - URLパス

  • クエリ文字列 - URLパラメータ

  • headers - リクエストヘッダー

  • クッキー - クライアントサイドのクッキー

  • body - XPATH、JSON、JSONスキーマを含むPOSTリクエスト本文、通常

式、完全に一致するプレーンテキストまたはボディパラメータ

上記のすべてのパラメータは、プレーンテキストまたは正規表現を使用して指定できます。

そして応答アクションは以下を含みます。

  • ステータスコード - 有効なHTTPステータスコード200、400など

  • body - 内容を含むバイトのシーケンスです

  • headers - 名前と1つ以上の値を持つ応答ヘッダー

  • cookies - 名前と1つ以上の値を持つレスポンスクッキー

私たちがどのようにして 期待を生み出すことができるか見てみましょう :

public class TestMockServer {
    private void createExpectationForInvalidAuth() {
        new MockServerClient("127.0.0.1", 1080)
          .when(
            request()
              .withMethod("POST")
              .withPath("/validate")
              .withHeader("\"Content-type\", \"application/json\"")
              .withBody(exact("{username: 'foo', password: 'bar'}")),
              exactly(1))
                .respond(
                  response()
                    .withStatusCode(401)
                    .withHeaders(
                      new Header("Content-Type", "application/json; charset=utf-8"),
                      new Header("Cache-Control", "public, max-age=86400"))
                    .withBody("{ message: 'incorrect username and password combination' }")
                    .withDelay(TimeUnit.SECONDS,1)
                );
    }
   //...
}

ここでは、 POST リクエストをサーバーにスタブしています。また、 exactly(1) callを使用してこの要求を行う必要がある回数を指定しました。

このリクエストを受け取ると、ステータスコード、ヘッダ、レスポンスボディなどのフィールドでレスポンスをモックしました。

5.2. リクエストを転送する

リクエストを転送するための期待値を設定できます。いくつかのパラメータでフォワードアクションを記述できます。

  • host - 転送先のホストwww.baeldung.com

  • port - リクエストを転送するポート、デフォルトのポート

80です scheme ** - 使用するプロトコルHTTPまたはHTTPS

転送リクエストの例を見てみましょう。

private void createExpectationForForward(){
    new MockServerClient("127.0.0.1", 1080)
      .when(
        request()
          .withMethod("GET")
          .withPath("/index.html"),
          exactly(1))
        .forward(
          forward()
            .withHost("www.mock-server.com")
            .withPort(80)
            .withScheme(HttpForward.Scheme.HTTP)
           );
}

この場合、MockServerを正確に1にヒットしてから別のサーバーに転送する要求をモックしました。 outer forward() メソッドはforwardアクションを指定し、inner forward() メソッド呼び出しはURLの構築とリクエストの転送を助けます。

5.3. コールバックの実行

  • 特定のリクエストを受信したときにコールバックを実行するようにサーバーを設定できます** コールバックアクションは org.mockserver.mock.action.ExpectationCallback インターフェースを実装するコールバッククラスを定義できます。これはデフォルトのコンストラクタを持ち、クラスパス上にあるべきです。

コールバックを使った期待の例を見てみましょう。

private void createExpectationForCallBack() {
    mockServer
      .when(
        request().withPath("/callback"))
        .callback(
          callback()
            .withCallbackClass("com.baeldung.mock.server.TestExpectationCallback")
        );
}

ここで、outer callback() はコールバックアクションを指定し、inner callback() メソッドはコールバックメソッドクラスのインスタンスを指定します。

この場合、MockServerが__/callback付きの要求を受け取ると、指定されたクラスに実装されているコールバックハンドルメソッドが実行されます。

public class TestExpectationCallback implements ExpectationCallback {

    public HttpResponse handle(HttpRequest httpRequest) {
        if (httpRequest.getPath().getValue().endsWith("/callback")) {
            return httpResponse;
        } else {
            return notFoundResponse();
        }
    }

    public static HttpResponse httpResponse = response()
      .withStatusCode(200);
}

5.4. リクエストを確認する

MockServerClient には、テスト対象システムがリクエストを送信したかどうかを確認する機能があります。

private void verifyPostRequest() {
    new MockServerClient("localhost", 1080).verify(
      request()
        .withMethod("POST")
        .withPath("/validate")
        .withBody(exact("{username: 'foo', password: 'bar'}")),
        VerificationTimes.exactly(1)
    );
}

ここでは、 org.mockserver.verify.VerificationTimes クラスを使用して、Mockサーバーがリクエストに一致する回数を指定します。

6. 結論

このクイック記事では、MockServerのさまざまな機能について説明しました。また、提供されているさまざまなAPI、および複雑なシステムをテストするためにどのように使用できるかについても調べました。

いつものように、この記事の完全なコードは入手可能です。 https://github.com/eugenp/tutorials/tree/master/testing-modules/mockserver [over GitHubで。