26

我用 mockk 创建了一个模拟类。在这个模拟中,我现在调用一个将 lambda 作为参数的方法。

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

class ObjectToMock() {
    fun methodToCall(someValue: String?, observer: (State) -> Unit) {
        ...
    }
}

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

4

3 回答 3

50

您可以使用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
}

answers范围内,您可以访问firstArg, secondArgetc 并通过将其作为通用参数提供来获取预期类型。请注意,我invoke在这里明确使用以使其更具可读性,也可以省略。

于 2018-12-07T16:51:39.323 回答
1

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

val observerMock = mockk<(State) -> Unit>()
于 2021-07-07T08:30:07.397 回答
1

我不得不为回调寻找更多示例,并在Kotlin Test with Mockk中找到了一些示例。就我而言,它更具体一些。我想检查模拟实现MyCustomCallback.ListenableFutureCallback

对于我的类,代码看起来像这样,ExampleProducer它有一个send函数:

 fun send(data: String) {
        val responseFuture  = kafkaTemplate.send(topic, data)
        responseFuture.addCallback(MyCustomCallback())
 }

所以这里谁来测试:

@Test
fun onFailureTest() {
    kafkaTemplate: KafkaTemplate<String, String> = mockk()
    val captureCallback = slot<ListenableFutureCallback<SendResult<String, String>>>()

    every { callback.addCallback(capture(captureCallback)) } answers {
               captureCallback.captured.onFailure(Throwable())
    }
    every { kafkaTemplate.send(any()) } returns callback

    val prod: ExampleProducer = ExampleProducer()
    prod.send("test")

    // Then you can verify behaviour or check your captureCallback.captured
    verify { kafkaTemplate.send(any()) }
    assertNotNull(captureCallback.captured)
}
于 2020-05-21T16:42:53.963 回答