如何运行传递给模拟方法的 lambda 函数?

Dav*_*kup 9 android unit-testing functional-programming kotlin mockk

我想知道如何运行作为参数传递给模拟函数的 lambda 函数。并在调用模拟方法时运行它。

我正在使用 Mockk,我想象代码是这样的:

class DataManager {
   fun submit(lambda: (Int) => Unit) { ... }
}

...

val mock = mockk<DataManager>()

every { mock.submit(lambda = any()) }.run { lambda(5) }
Run Code Online (Sandbox Code Playgroud)

在我的实际实现中,数据管理器调用服务器并在收到成功响应时运行 lambda 作为回调。lambda 恰好是被测类的私有方法。

use*_*377 12

您需要使用 Capture 而不是 Any。

val dataManager: DataManager = mockk()

every { dataManager.submit(captureLambda()) } answers { lambda<(Int) -> Unit>().invoke(5) }

dataManager.submit { i -> println(i) }
Run Code Online (Sandbox Code Playgroud)

此外,您的函数类型的声明无效。

(Int) => Unit该有的时候你就有了(Int) -> Unit


小智 6

可以通过以下方法解决。

带有答案中的参数:

every { dataManager.submit(any()) } answers {
      firstArg<(Int) -> Unit>().invoke(5)
}
Run Code Online (Sandbox Code Playgroud)

或使用 captureLambda

every { dataManager.submit(captureLambda()) } answers {
      lambda<(Int) -> Unit>().captured.invoke(5)
}
Run Code Online (Sandbox Code Playgroud)