モックとは
テスト対象のクラスAがクラスBに依存しているとき、クラスBの処理まで書くのは非常に手間がかかります。
また、クラスBのテストは既に存在していて、クラスBの処理が正しいことが保証されているのであれば
クラスBのテストは必要ありません。
このような状況のとき、クラスBの返却値を任意に設定できるのがMockです。
javaでMockを使いたい場合、Mockitoというライブラリを使うと便利でした。
下記は、テスト対象のクラス(Monkey1)の中で呼ばれているMonkey2をMock化し、
Mock化したメソッドが1回呼ばれていることを確認するテストです。
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class sampleTest {
// テスト対象のクラス
@InjectMocks
private Monkey1 monkey1 = new Monkey1();
// Mockにしたいクラス
@Mock
private Monkey2 monkey2;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testA() {
// setup: Monkey2の振る舞いを設定する
when(monkey2.getBestFoods()).thenReturn("banana");
// then
sut.eatLunch();
// expect : メソッドが1回呼ばれることを確認する
verify(monkey2, times(1)).getBestFoods();
}
}
引数が必要なメソッドをMock化する
値を指定しないで任意の値にしたい場合はany()を使います。
when(monkey2.eatLunchWith(any()));
返却値がないメソッドをMock化する
voidのメソッドをMockにするときはdoNoting()を使います。
doNoting().when(monkey2).sleep();
MockでExceptionをthrowさせる
thenReturn()の代わりにthenThrow()を使います。
when(monkey2.angry()).thenThrow(new Exception("例外発生"));
無駄なテストをMock化して効率的にテストをしましょう。