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();
}
}