Edited at

Mockitoによる非同期処理のテスト

More than 3 years have passed since last update.

Javaのユニットテストで非同期処理をテストしたい場合、

MockitoVerificationWithTimeoutを使うと簡潔にテストを記述できます。

例として、非同期処理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();
}
}