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



给定

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 (

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

如何解决?

这对

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

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

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()) }
    }
}

最新更新