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