忙しくブログ書いている暇が無かった為、大分空いてしまいました。
GWを利用して投稿してみます。
今回はMockitoを備忘録代わりに書きます。
まずMockitoですが、モックライブラリと呼ばれるもので
テストの為に一部の動作をすげ変えたり、期待通りの動きをしたか
検証したりするものです。
具体例を出すと
昼に呼ぶと「こんにちは」、夜に呼ぶと「こんばんは」と出力する
メソッドがあるとします。
このメソッドをテストしたい場合、動かす時間によって結果が変わって
しまい、昼にテストしても「こんばんわ」が出るか確認できません。
このような場合に時間を取得する処理だけをモック化する事で
「こんにちは」と出させたり、「こんばんは」と出させたりできます。
一言で言うと、自身が自由にできない外部の要因がある場合に
モックライブラリを使うと自由にできると言った感じです。
ライブラリは以下からダウンロードします。
Maven等を使っても良いです。
http://mockito.org/
実際にソースを見ていきましょう。
[期待通りの動きか検証]
//①staticインポートすると使いやすい
import static org.mockito.Mockito.*;
public class Test1 {
@Test
public void test() {
//②モック作成
List<String> mockedList = mock(List.class);
//③テスト
mockedList.add("one");
//④呼ばれたか検証。呼ばれてない場合、例外発生
verify(mockedList).add("one");
}
}
基本は途中のコメントの通りです。
モック作成して、テストコード実行して検証します。
検証はverifyで行いますが、上記の場合はaddメソッドを引数"one"で
呼び出しているかという検証になります。
もし、呼んでいなかった場合は例外が発生します。
見ての通り、どの箇所のverifyが失敗しているのか
実際にはどんな値が来たのか分かるようになっていて便利です。
次に動作をすげ変えてみます。
[動作のすげ変え]
//①モック作成
LinkedList mockedList = mock(LinkedList.class); //②させたい動作を記述
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
//③テスト。firstが帰ってくる
System.out.println(mockedList.get(0));
//④テスト。RuntimeExceptionが発生する
System.out.println(mockedList.get(1)); 上記のようにwhenメソッドで指定したメソッド(+引数)が呼ばれた場合に
thenRturnの中身が帰ってくるようになります。
例外を発生させたい場合はthenThrowです。
また、モックというのは元のクラスにあるメソッド全ての動作が一旦クリア
されるので、この後にmockedList.get(100)とかやってもnullが帰ってくるだけです。
注意点ですが、上記のwhen + thenReturnは戻り値がvoid以外の
メソッドに対してのみ使えます。
あと、verifyはあくまで動作したか検証するだけなので上記で
verify(mockedList).get(1);とか書いてもRuntimeExceptionは発生しません。
voidの場合は他のやり方で行いますが、次回以降に説明します。