2017-07-28 19 views
2

とモック両方の戻り値、私はいくつかの値を返し、また、例えば、コールバックMockito:mockitoでコールバックメソッド

を呼び出すために持っているメソッドをモックとしたい、ここではサービスメソッドです:

String fetchString(Callback<String> callback); 
は、

コールバックが呼び出される前に戻り値を発生させたい。 Mockito.doAnswer(..)を使ってみましたが、return文の後にコールバックを呼び出す方法を理解できていないようです。例:

when(mockService.fetchString(any(Callback.class)).thenAnswer(
    new Answer<String>() { 
     String answer(InvocationOnMock invocation) { 
      ((Callback<String>) invocation.getArguments()[0]).onResult("callback string"); 
      return "return string"; 
     } 
    }); 

上記の例のように、値が返される前にコールバックが呼び出されます。これは、非同期コールバックを適切にテストしません。値が返された後にコールバックメソッドを呼び出す方法はありますか?

私はここで引数のキャプチャを使用できることを知っていますが、手動でコールバックを呼び出す必要はありません。

doAnswer(..)thenReturn(..)の組み合わせの何か?

+1

使用 'ArgumentCaptor' 。 – talex

+0

@Talex 'ArgumentCaptor'を使うことができますが、テスト対象のメソッドが呼び出された後でなければなりません。私は彼がテスト中のメソッドがまだ実行されている間、そのコールバックを呼び出すと思うと思います。 –

+0

彼は特に、 "値が返された直後にコールバックメソッドが呼び出される"と述べています。 – talex

答えて

1

これを実現する最善の方法は、@タレックスのようにArgumentCaptorを使用することです。

私はそれを使用する方法は、次のとおりです。

サービス方法:

String fetchString(Callback<String> callback); 

JUnitテスト:コールバックのインスタンスを取得し、あなたがそれを必要とするとき、それを呼び出すため

ArgumentCaptor<Callback> captor = ArgumentCaptor.forClass(Callback.class); 
when(mockService.fetchString(captor.capture()).thenReturn("return string"); 

String answer = mockService.fetchString(callbackToTest); 
// callback is invoked after the service method returned the value 
captor.getValue().onResult("callback string"); 

assertEquals("return string", answer); 
verify(callbackToTest).onResult(eq("callback string")); 
関連する問題