MockServerの紹介

MockServerの概要

1. 概要

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

2. Mavenの依存関係

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


    org.mock-server
    mockserver-netty
    3.10.8


    org.mock-server
    mockserver-client-java
    3.10.8

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

3. MockServer機能

簡単に言えば、このツールは以下を実行できます。

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

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

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

  • リクエストを検証する

4. MockServerを実行する方法

サーバーはいくつかの異なる方法で起動できます。これらの方法のいくつかを見てみましょう。

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

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


    org.mock-server
    mockserver-maven-plugin
    3.10.8
    
        1080
        1090
        DEBUG
        org.mockserver.maven.ExampleInitializationClass
    
    
        
            process-test-classes
            process-test-classes
            
                start
            
        
        
            verify
            verify
            
                stop
            
        
    

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からの結果のレスポンスをモックするメカニズムです。

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

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

  • path – URLパス

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

  • ヘッダー–要求ヘッダー

  • クッキー–クライアント側のクッキー

  • body – XPATH、JSON、JSONスキーマ、正規表現、正確に一致するプレーンテキストまたは本文パラメーターを含むPOST要求本文

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

そして、応答アクションには以下が含まれます。

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

  • body –コンテンツを含むバイトシーケンス

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

  • cookie –名前と1つ以上の値を持つ応答cookie

create an expectationの方法を見てみましょう。

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)呼び出しを使用してこの要求を行う必要がある回数を指定しました。

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

5.2. リクエストの転送

リクエストを転送するように期待を設定できます。 いくつかのパラメーターは、転送アクションを説明できます。

  • host –転送先のホスト。 www.example.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を正確にヒットするリクエストをモックし、別のサーバーに転送します。 外側のforward()メソッドは転送アクションを指定し、内側のforward()メソッド呼び出しはURLの構築に役立ち、要求を転送します。

5.3. コールバックの実行

The server can be set to execute a callback when receiving a particular request.コールバックアクションは、org.mockserver.mock.action.ExpectationCallbackインターフェイスを実装するコールバッククラスを定義できます。 デフォルトのコンストラクターがあり、クラスパス上にある必要があります。

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

private void createExpectationForCallBack() {
    mockServer
      .when(
        request().withPath("/callback"))
        .callback(
          callback()
            .withCallbackClass("com.example.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と、それを使用して複雑なシステムをテストする方法についても検討しました。

いつものように、この記事の完全なコードは利用可能ですover on GitHub.