无法使用 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()) }
}
}
给定
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()) }
}
}