Javaのユニットテストで非同期処理をテストしたい場合、
MockitoのVerificationWithTimeoutを使うと簡潔にテストを記述できます。
例として、非同期処理Foo#requestとそのテストコードを示します。
このテストはFoo#requestの中でCallback#onSuccessが10秒以内に呼ばれることを確認します。
timeoutメソッドが肝です。timeoutの引数にはタイムアウト値をミリ秒単位で指定します。
Foo.java
public class Foo {
public static void request(Callback callback) {
new Thread() {
...
callback.onSuccess();
}.start();
}
}
FooTest.java
import static org.mockito.Mockito.*;
public class FooTest {
@Test
public void test() {
Callback callbackMock = mock(Callback.class);
Foo.request(callbackMock);
verify(callbackMock, timeout(10000)).onSuccess();
}
}
更に、timesを指定することもできます。
FooTest.java
import static org.mockito.Mockito.*;
public class FooTest {
@Test
public void test() {
Callback callbackMock = mock(Callback.class);
Foo.request(callbackMock);
verify(callbackMock, timeout(10000).times(2)).onSuccess();
}
}