1

给定

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

如何解决?

4

1 回答 1

3

这对我有用。该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()) }
    }
}
于 2019-07-19T13:10:15.693 回答