Mockを使ったテスト

モックとは



テスト対象のクラス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化して効率的にテストをしましょう。