如何使用Mockk调用Lambda回调

Jan*_*usz 4 mocking kotlin mockk

我用ockk创建一个类的模拟。在此模拟上,我现在调用一个将lambda作为参数的方法。

此lambda用作回调,以将回调的状态更改传递给方法的调用方。

class ObjectToMock() {
    fun methodToCall(someValue: String?, observer: (State) -> Unit) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如何配置模拟以调用传递的Lambda?

s1m*_*nw1 12

您可以使用answers

val otm: ObjectToMock = mockk()
every {  otm.methodToCall(any(), any())} answers {
    secondArg<(String) -> Unit>().invoke("anything")
}

otm.methodToCall("bla"){
    println("invoked with $it") //invoked with anything
}
Run Code Online (Sandbox Code Playgroud)

answers范围内,您可以访问firstArgsecondArg等等,甚至可以通过将其作为通用参数提供来获得期望的类型。请注意,我invoke以前使它更具可读性,您也可以将其作为带空括号的普通函数来调用。

  • 注意:这对于 Kotlinambas 来说就像一个魅力,如果你试图模拟一个使用ambas语法传递的接口,它将导致“ClassCastException [...]无法转换为kotlin.jvm.functions.Function1” 。在这种情况下,你应该执行类似 `secondArg&lt;DummyInterface&gt;().onDummyEvent("dummy-value")` 的操作。 (3认同)

Mar*_*s K 7

也许不完全是你所问的,但你可以使用 funciton 类型进行模拟:

val observerMock = mockk<(State) -> Unit>()
Run Code Online (Sandbox Code Playgroud)