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

Cannot test callbacks with mockk: invoke(any())) was not called

给定

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 对象不需要模拟,因为它是正在测试的 class。通过模拟它,测试仅记录 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()) }
    }
}