【JUnit】【Mock】 Mockito ~構文編~

【1】 Mock オブジェクト作成用メソッド

(1) Mock オブジェクト作成 : Mockito.mock()

 * Mock オブジェクトを作成する

// ex1 ListのMock オブジェクトを作成
List mock = Mockito.mock(List.class);

// ex2 SampleClass01(下記のサンプル参照)のMock オブジェクトを作成
SampleClass01 sampleClass01 = Mockito.mock(SampleClass01.class);

(2) 一部だけモック化したオブジェクト作成 : Mockito.spy()

 * 一部だけモック化したオブジェクトを作成する

// 本物メソッドを呼ぶ必要があるから、本物インスタンスを渡す
SampleClass01 sampleClass01 = Mockito.spy(new SampleClass01());

// Mockメソッド
Mockito.when(sampleClass01.getValue()).thenReturn("Fixed value");
assertEquals("Fixed value", sampleClass01.getValue());

// 本物のメソッドの動作
assertEquals("Hellow World, Mike!", sampleClass01.getValue("Mike"));

【2】 検証用メソッド

(1) メソッド呼び出しの妥当性検証 : Mockito.verify()

 * モック化したメソッドが「呼ばれたか?」等をチェックする機能

// ex1 add() メソッドが引数 "To confirm calling add method" として呼び出されたかどうかを検証
Mockito.verify(mock).add("To confirm calling add method"); 

// ex2 SampleClass01(下記の関連記事の入門編のサンプル参照)のgetValue()メソッドが少なくとも1回呼び出されたかどうかを検証
Mockito.verify(sampleClass01, Mockito.atLeast(1)).getValue();

// ex3 getValue()メソッドが「最後の1回」「少なくとも2回」「多くとも4回」呼び出されたかどうかを検証
Mockito.verify(sampleClass01, atLeastOnce()).getValue();
Mockito.verify(sampleClass01, atLeast(2)).getValue();
Mockito.verify(sampleClass01, atMost(4)).getValue();

// ex4 add("Xxx")メソッドが「2回呼び出された」「0回(呼び出されていない)」「呼び出されていない」かどうかを検証
Mockito.verify(mock, Mockito.times(2)).add("Xxx");
Mockito.verify(mock, Mockito.times(0)).add("Xxx");
Mockito.verify(mock, Mockito.never()).add("Xxx");

(2) 戻り値ありのメソッドに振る舞いを設定 : Mockito.when()

 * Mockito.when().thenReturn() : メソッドの戻り値を設定する
 * Mockito.when().thenThrow()  : 例外投げるように設定する

// ex1 get(0) メソッドが呼び出されたら "001" を返す
Mockito.when(mock.get(0)).thenReturn("001");

// ex2 SampleClass01のgetValue()メソッドが呼び出されたら "Fixed value" を返す
Mockito.when(sampleClass01.getValue()).thenReturn("Fixed value");

// ex3 get() メソッドにどんな引数でも呼び出されたら RuntimeException を投げる
Mockito.when(mock.get(Mockito.anyInt())).thenThrow(new RuntimeException());

(3) 戻り値なしのメソッドに振る舞いを設定 : Mockito.doXxxx()

 * Mockito.doCallRealMethod() : 本物メソッドを呼ぶ
 * Mockito.doNothing()        : 戻り値なしメソッドに何もなかったことにしたい時に使う
 * Mockito.doThrow()          : 例外投げるように設定する

// ex1
Mockito.doCallRealMethod().when(sampleClass01).setAge(18)

// ex2
Mockito.doNothing().when(httpSession).invalidate();

// ex3
Mockito.doThrow(new RuntimeException()).when(sampleClass01).setAge(Mockito.anyInt());