无法使用嘲笑测试回调:未调用invoke(any()))

时间:2019-07-11 23:25:04

标签: kotlin mocking mockk

给出

nginx

typealias MyCallback = (s: String) -> Unit

object Hello {
    fun main() {
        blah { print(it) }
    }
    fun blah(cb: MyCallback) {
        cb.invoke("hi")
    }
}

同时使用这两种方法,我都会收到上述错误(interface MyCallback { fun invoke (s: String) {} } object Hello { fun main() { blah(object : MyCallback { override fun invoke(s: String) { print(s) } }) } fun blah(cb: MyCallback) { cb.invoke("hi") } }

Verification failed: call 1 of 1: MyCallback(#2).invoke(any())) was not called

如何解决?

1 个答案:

答案 0 :(得分:1)

这对我有用。 Hello对象不需要被模拟,因为它是被测试的类。通过模拟,测试仅记录了blah()的调用,而没有实际执行它们。

使用spyk而不是mockk可以构造MyCallback类型,从而可以定义invoke()函数。因此,也许这是解决问题的一种方法,而不是解释为什么ockock似乎不保留该类型信息。

typealias MyCallback = (s: String) -> Unit

object Hello {
    fun main() {
        blah { print(it) }
    }
    fun blah(cb: MyCallback) {
        cb.invoke("hi")
    }
}

class MockKTest {

    @Test
    fun testInvoke() {
        val mock = spyk<Hello>()
        val cb = mockk<MyCallback>(relaxed = true)
        mock.blah(cb) // or just do Hello.blah(cb)
        verify { cb.invoke(any()) }
    }
}