假设我有以下两门课程:
class Foo {
fun <RES> execute(callback: () -> RES): RES {
return callback.invoke()
}
}
class Bar(
private val foo: Foo,
) {
fun perform(): String {
return foo.execute {
"Hello World"
}
}
}
测试时
Bar
我想模拟对Foo#execute
的调用
我使用 MockK 尝试了以下操作(期望测试打印“模拟答案”):
class BarTest {
private val foo: Foo = mockk()
private val bar = Bar(foo)
@Test
fun test() {
every {
foo.execute {
"Hello World"
}
}.answers {
"Mock Answer"
}
println(bar.perform())
}
}
但是,我得到以下异常:
io.mockk.MockKException: no answer found for Foo(#1).execute(lambda {}) among the configured answers: (Foo(#1).execute(eq(lambda {}))))
我想发生这种情况是因为回调被创建为匿名类,因此这两个对象是不同的,尽管都返回字符串“Hello World”,我的问题是有没有一种方法可以使用 MockK 或其他方式来实际完成此操作?
另外,如果我尝试创建一个回调对象,例如
val callback = { "Hello World" }
,然后在 Foo#execute
和测试中将其传递给 Bar#perform
,我会得到预期的结果,但这当然不会在真实场景。
您可以使用 Capturing 插槽来模拟 lambda 响应
@Test
fun test() {
val slot = slot<() -> Any>()
every {
foo.execute (capture(slot))
}.answers {
"Mock Answer"// slot.captured.invoke()
}
assertEquals("Mock Answer", bar.perform())
}