🌊

MockKで引数をキャプチャする方法

2022/09/30に公開

例えば

fun example(flg: Boolean){
  val arg = if(flg) "true" else "false"
  mockObj.call(arg)
}

というコードがあったとします。
もしテストを書くなら、flgによってcall()に渡される引数が正しい値が入ってるかどうかを書くかなと思います。(ここは例であって大して大事じゃない前提なので適当です。)

そういう時に、どうすればMoccKで確認できるかという内容です。

Mockitoの場合

MockitoだとArgumentCaptorというのを使うというのがすぐに出てきます。
こっちは本筋じゃないので解説なしです。

MockKの場合

CapturingSlotというのを使えます。
今回の場合だと

@Test
fun exampleTest_true(){
  val argSlot = slot<String>()
  every{ mockObj.call(capture(argSlot) } returns Unit
  
  subject.example(true)
  
  assertEquals("true", argSlot.captured)
}

で引数に渡した値を確認できます。

おわり

Mockitoの場合だとすぐに解決方法出てきた割にMockKの場合の方法がそれに比べるとパッと出てこなかったので記事に書きました。
参考にした記事は↓です。
https://notwoods.github.io/mockk-guidebook/docs/mockito-migrate/argument-captor/

Discussion