Mockitoの使い方とTips

MockitoはJava用のモックライブラリで、JUnitユニットテスト)を簡単にします。
今のプロジェクトでもMockitoを使用しているので、使い方やTipsをまとめたいと思います。

Mockitoの使い方

Mockitoの使い方は以下が参考になります。

Mockito事始め - 俄

リダイレクトの警告

MockitoのTips

Mockitoで嵌りやすいところをTipsとしてまとめました。
使用しているMockitoのバージョンは1.10.19です。

thenReturn 対 doReturn

メソッドをモック化する方法はthenXX系(thenReturnやthenThrowなど)とdoXX系(doReturnやdoThrowなど)の2通りがあります。
どちらを使うかですが、doXX系を使った方が良いかと思います。
なぜなら、thenXX系では使用できないケースがあるからです。

thenXX系が使用できないケース

  • voidメソッドの場合
  • spy(@Spy、Mockito.spy())でモック化したオブジェクトの場合

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の実行時エラーと対処法を発生ベースでまとめていきたいと思います。