Mockitoでコールバックをテストする

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プロジェクト]で利用可能です。