1. 概要

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

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>

依存関係の最新バージョンは、mockserver-nettyおよびmockserver-client。として入手できます。

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. JavaAPIを介した起動

startClientAndServer()JavaAPIを使用してサーバーを起動できます。 通常、すべてのテストを実行する前にサーバーを起動します。

public class TestMockServer {

    private ClientAndServer mockServer;

    @BeforeClass
    public void startServer() {
        mockServer = startClientAndServer(1080);
    }
 
    @AfterClass 
    public void stopServer() { 
        mockServer.stop();
    }
 
    // ...
}

5. 模擬クライアント

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

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

5.1. 模擬応答で期待を作成する

期待値は、クライアントからの要求とMockServerからの結果の応答をモックするメカニズムです。

期待値を作成するには、要求マッチャーと返される応答を定義する必要があります。

リクエストは、以下を使用して照合できます。

  • パス–URLパス
  • クエリ文字列–URLパラメータ
  • ヘッダー–リクエストヘッダー
  • クッキー–クライアント側のクッキー
  • body – XPATH、JSON、JSONスキーマ、正規表現、完全に一致するプレーンテキストまたは本文パラメーターを含むPOSTリクエスト本文

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

また、応答アクションには次のものが含まれます。

  • ステータスコード–有効なHTTPステータスコード(例: 200、400など
  • 本文–コンテンツを含むバイトのシーケンスです
  • ヘッダー–名前と1つ以上の値を持つ応答ヘッダー
  • クッキー–名前と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です。
  • スキーム–使用するプロトコル例: 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に正確にヒットし、別のサーバーに転送するリクエストをモックしました。 外側のforward()メソッドは転送アクションを指定し、内側の 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")
        );
}

ここで、外側の callback()はコールバックアクションを指定し、内側の 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 クラスは、モックサーバーがリクエストに一致する回数を指定するために使用されます。

6. 結論

このクイック記事では、MockServerのさまざまな機能について説明しました。 また、提供されているさまざまなAPIと、それを使用して複雑なシステムをテストする方法についても説明しました。

いつものように、この記事の完全なコードはGitHubで入手できます。