Mockitoの使い方とTips
MockitoはJava用のモックライブラリで、JUnit(ユニットテスト)を簡単にします。
今のプロジェクトでもMockitoを使用しているので、使い方やTipsをまとめたいと思います。
Mockitoの使い方
Mockitoの使い方は以下が参考になります。
MockitoのTips
Mockitoで嵌りやすいところをTipsとしてまとめました。
使用しているMockitoのバージョンは1.10.19です。
thenReturn 対 doReturn
メソッドをモック化する方法はthenXX系(thenReturnやthenThrowなど)とdoXX系(doReturnやdoThrowなど)の2通りがあります。
どちらを使うかですが、doXX系を使った方が良いかと思います。
なぜなら、thenXX系では使用できないケースがあるからです。
thenXX系が使用できないケース
thenXX系の利点はコンパイル時に引数の型チェックをしてくれることです。
しかし、テストクラスは実行しながら作成するので、型チェックの恩恵はそこまで感じませんでした。
thenXX系とdoXX系を使い分けるよりもdoXX系に統一した方が楽です。
// 構文 Mockito.when(クラス名.メソッド名(引数)).thenReturn(戻り値); Mockito.doReturn(戻り値).when(クラス名).メソッド名(引数); // 例 Mockito.when(Hoge.fuga("foo")).thenReturn("bar"); Mockito.doReturn("bar").when(Hoge).fuga("foo");
参考
Mockito (Mockito 2.23.4 API)
Matcherと通常引数の併用
Matcher(anyXX系)は任意の引数を指定する場合に便利です。
// 引数が"foo"の場合に"bar"を返す Mockito.doReturn("bar").when(Hoge).fuga("foo"); // 引数が任意の文字列の場合に"bar"を返す Mockito.doReturn("bar").when(Hoge).fuga(anyString());
ただし、Matcherを使った引数と通常の引数を併用することはできないので、通常の引数はeq()で囲ってMatcherに変換する必要があります。
// NG(実行時エラー) Mockito.doReturn("bar").when(Hoge).fuga(anyString(), "foo"); // OK Mockito.doReturn("bar").when(Hoge).fuga(anyString(), eq("foo"));
参考
Mockitoの新機能を使ったモダンげな使い方 - 愛と勇気と缶ビール
モックで本物のメソッドを呼ぶ方法
特定のメソッドだけ本物のメソッドを呼び出したい場合があるかと思います。
その場合はspyもしくはthenCallRealMethodが使えます。
spy
spy(@Spy, Mockito.spy())でモック化したオブジェクトは本物のメソッドを呼び出します。
doXXX系を使うことで、特定のメソッドをモック化することができます。
thenCallRealMethod()
mock(@Mock, Mockito.mock())でモック化したオブジェクトに対して、thenCallRealMethod()を指定することで、本物のメソッドを呼び出すことができます。
// fugaメソッドは本物が呼ばれる Mockito.when(Hoge.fuga("foo")).thenCallRealMethod();
参考
テックノート – Junitライブラリ「Mockito」の@Spyの使い方
テックノート – Junitライブラリ「Mockito」で一部本物のメソッドを使う方法(thenCallRealMethod)
Next Action
@MockBeanの使い方
@Mockと@MockBeanの使い分けがよく分からなかったので、分かり次第追記します。
参考
Spring BootでAutowiredされるクラスをMockitoでモックする - Qiita
Mockito.mock() vs @Mock vs @MockBean | Baeldung
Mockito実行時エラーの対処法
Mockitoで実行時エラーとなった場合にエラーの原因を特定するのが難しいことが度々ありました。
Mockitoの実行時エラーと対処法を発生ベースでまとめていきたいと思います。