如何在 kotlin 中模拟接受回调的函数

问题描述 投票:0回答:1

假设我有以下两门课程:

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
,我会得到预期的结果,但这当然不会在真实场景。

kotlin mockk
1个回答
0
投票

您可以使用 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())
   }
© www.soinside.com 2019 - 2024. All rights reserved.