【Mock】 Mockito ~ 基本編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2014/07/18/233904

の続き。
今回は、Javaのモック「Mockito」の構文について扱う

目次

【1】Mock オブジェクト作成用メソッド
 1)Mockito.mock()
 2)Mockito.spy()
【2】 検証用メソッド
 1)Mockito.verify()
 2)Mockito.when().thenXxxx()
 3)Mockito.doXxxx()

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

1)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().thenXxxx()

* 戻り値ありのメソッドに振る舞いを設定
* 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());

参考文献

http://syagami.web.fc2.com/mockito.htm
http://snowsaber.dip.jp/java/mockito/base.html

関連記事

Mockito ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/07/18/233904