技術系TIPS
PR

mockito-kotlinで同じmockの戻りを呼び出し回数で変更する

saratogax
記事内に商品プロモーションを含む場合があります

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)
)
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました