1.概要

この短いチュートリアルでは、一般的なテストフレームワークhttp://site.mockito.org/[モッキート]を使用して

コールバックを

テストする方法に焦点を当てます。

最初に

ArgumentCaptor

を使用し、次に直感的な

doAnswer()

メソッド** を使用して、2つの解決策を探ります。

Mockitoを使ったテストの詳細については、Mockitoシリーズのリンクを調べてください。

2.コールバックの紹介

  • コールバックはメソッドに引数として渡されるコードの一部です。メソッドは与えられた時間に引数をコールバック(実行)することが期待されています。

この実行は、同期コールバックの場合のように即時に行われる可能性がありますが、より一般的には非同期コールバックの場合のように後で発生する可能性があります。

コールバックを使用するための一般的なシナリオは、

サービス呼び出しからの応答を処理する必要があるときのサービス対話中の

です。

このチュートリアルでは、テストケースの共同作業者として、以下に示す

Service

インターフェイスを使用します。

public interface Service {
    void doAction(String request, Callback<Response> callback);
}


Callback

引数には、

reply(T response)

メソッドを使用して応答を処理するクラスを渡します。

public interface Callback<T> {
    void reply(T response);
}

2.1. 簡単なサービス

また、単純な

サービスの例を使用して、コールバック

を渡して呼び出す方法を説明します。

public void doAction() {
    service.doAction("our-request", new Callback<Response>() {
        @Override
        public void reply(Response response) {
            handleResponse(response);
        }
    });
}


handleResponse

メソッドは、

Response

オブジェクトにデータを追加する前に、応答が有効かどうかを確認します。

private void handleResponse(Response response) {
    if (response.isValid()) {
        response.setData(new Data("Successful data response"));
    }
}

わかりやすくするために、Java Lambda式を使用せずにservice.Action ** 呼び出しをより簡潔に記述することもできます。

service.doAction("our-request", response -> handleResponse(response));

Lambda式の詳細については、/java-8-lambda-expressions-tips[ここ]のリンクを参照してください。

3.

ArgumentCaptor

を使う

それでは、




ArgumentCaptor ** を使用してCallback__オブジェクトを取得するためのMockitoの使用方法を見てみましょう。

@Test
public void givenServiceWithValidResponse__whenCallbackReceived__thenProcessed() {
    ActionHandler handler = new ActionHandler(service);
    handler.doAction();

    verify(service).doAction(anyString(), callbackCaptor.capture());

    Callback<Response> callback = callbackCaptor.getValue();
    Response response = new Response();
    callback.reply(response);

    String expectedMessage = "Successful data response";
    Data data = response.getData();
    assertEquals(
      "Should receive a successful message: ",
      expectedMessage, data.getMessage());
}

この例では、このハンドラの

doAction

メソッドを呼び出す前に、まず____ActionHandlerを作成します。 ** これは単純なSimple ServiceのdoActionメソッド呼び出しのラッパーです。ここでコールバックを呼び出します。

次に、最初の引数として


anyString()


を渡し、2番目の引数として**

__ callbackCaptor.capture()


を渡して、


doAction


がモックサービスインスタンスに呼び出されたことを確認します。その後、

getValue()__メソッドを使用して、取得した引数の値を返すことができます。


Callback

オブジェクトを取得したので、次に

reply

メソッドを直接呼び出す前にデフォルトで有効な

Response

オブジェクトを作成し、応答データに正しい値があることをアサートします** 。

4.

doAnswer()

メソッドを使う

次に、Mockitoの


Answer

オブジェクトと

doAnswer

メソッドを使用してvoidメソッドをスタブ化する


doAction:

コールバックを持つメソッドをスタブ化するための** 一般的な解決策を見てみましょう。

@Test
public void givenServiceWithInvalidResponse__whenCallbackReceived__thenNotProcessed() {
    Response response = new Response();
    response.setIsValid(false);

    doAnswer((Answer<Void>) invocation -> {
        Callback<Response> callback = invocation.getArgument(1);
        callback.reply(response);

        Data data = response.getData();
        assertNull("No data in invalid response: ", data);
        return null;
    }).when(service)
        .doAction(anyString(), any(Callback.class));

    ActionHandler handler = new ActionHandler(service);
    handler.doAction();
}

そして、2番目の例では、まずテストの後半で使用される無効な

Response

オブジェクトを作成します。

次に、

doAction

が呼び出されたときに呼び出しをインターセプトし、

invocation.getArgument(1)

** を使用してメソッドの引数を取得し、

Callback

引数を取得するように、

Answer

をモックサービスに設定します。

__

最後のステップは、

__ ActionHandlerを作成し、

doActionを呼び出すことです。これにより、

Answer

が呼び出されます。

voidメソッドをスタブ化することについてもっと学ぶためには、/mockito-void-methods[ここ]のリンクを見てください。

3.まとめ

この短い記事では、Mockitoを使ってテストする際にコールバックをテストするための2つの異なる方法について説明しました。

いつものように、例はこのhttps://github.com/eugenp/tutorials/tree/master/testing-modules/mockito[GitHubプロジェクト]で利用可能です。