TL;DR
every
内でany()
を指定しているにも関わらず、io.mockk.MockKException: no answer found for: ~
となる場合は、any</* 引数として渡したい型 */>()
と修正することで解決できるかもしれません。
具体的には、fun func(...): Any
(Java
ならObject
)とfun <T> func(...): T
のような定義が有る場合です。
状況
下記のSample
クラスに定義したfunc
メソッドの内、KClass
を引数に取る方をモックしようとしました。
class Sample {
fun <T : Any> func(value: KClass<T>): T = /* Tの生成処理 */
fun func(value: String): Any = /* Anyを返すような処理 */
}
所が、下記のテストコードでは、モックしたはずのfunc
関数を呼び出した所でテストが失敗しました。
エラーメッセージはio.mockk.MockKException: no answer found for: Sample(#1).func(Target)
となっていました。
class Test {
@Test
fun test() {
val sample = mockk<Sample>()
every { sample.func(any()) } returns Target()
// ここで落ちる
val result = sample.func(Target::class)
assertEquals(Target(), result)
verify(exactly = 1) { sample.func(Target::class) }
}
}
対処
以下のようにany()
にジェネリクスを指定してやることで解決します。
class Test {
@Test
fun test() {
val sample = mockk<Sample>()
// ジェネリクス指定を追加
every { sample.func(any<KClass<*>>()) } returns Target()
val result = sample.func(Target::class)
verify(exactly = 1) { sample.func(Target::class) }
}
}