mockito-kotlinで同じmockの戻りを呼び出し回数で変更する
Mockito-Kotlin で application 層のユニットテストを作成中。
こんなケースはないでしょうか。
・最初の呼び出しは null を返したい
・2 回目の呼び出しはオブジェクトを返したい
mock 化したクラスの同じメソッド呼び出しで返却値の挙動を変える方法ですね。
今回は、whenever と thenReturn を使った方法を紹介します。
Mockito-Kotlin
Kotlin で Mockito を使うなら Mockito-Kotlin ということで、シェアが多くなっています。
最初は、こんなテストを書きたいけど書き方がわからないという場面も多いと思いますが、そこは慣れですね。
サンプルのテストコードなどを参考に、よく使うものを覚えておきたいところです。
mockの挙動
hoge という mock クラスの find() メソッドを呼び出した時、特定の値を返す定義を考えてみます。
まずは null を返す場合。
whenever(hoge.find(
eq(id),
eq(name)
))
.thenReturn(null)次に特定のオブジェクトを返す場合。
whenever(hoge.find(
eq(id),
eq(name)
))
.thenReturn(fuga)
mockメソッドの挙動
では、1 回目の find() メソッドの呼び出しでは null を返して、2 回目はオブジェクトを返したい場合を考えてみます。
whenever(hoge.find(
eq(id),
eq(name)
))
.thenReturn(null, fuga)上記の通り、thenReturn() の引数は複数の values の定義が可能なのですよね。
以下の書き方も可能なようですが、数によって使い分けするといいかもしれません。
whenever(hoge.find(
eq(id),
eq(name)
))
.thenReturn(null)
.thenReturn(fuga)
最後に、find() メソッドが 2 回呼び出されていることを確認しておけば最低限のテストは書けそうですね。
verify(hoge, times(2)).find(
eq(id),
eq(name)
)
実際のテストにまとめると
ここまでの書き方をまとめると、たとえば次のような 1 本のテストになります。
@Test
fun `1回目はnull、2回目はオブジェクトを返す`() {
val hoge = mock<Hoge>()
whenever(hoge.find(eq(id), eq(name))).thenReturn(null, fuga)
assertNull(hoge.find(id, name)) // 1回目
assertEquals(fuga, hoge.find(id, name)) // 2回目
verify(hoge, times(2)).find(eq(id), eq(name))
}
mock<Hoge>() でモックを作り、thenReturn(null, fuga) で 1 回目・2 回目の戻り値を定義し、最後に verify で呼び出し回数を確認する、という流れです。
static メソッドや final クラスのモック化でつまずいた場合は、こちらの記事もあわせてどうぞ。

