如何使用Mockk调用Lambda回调

时间:2018-12-07 16:20:25

标签: kotlin mocking mockk

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

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

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

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

3 个答案:

答案 0 :(得分:8)

您可以使用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范围内,您可以访问firstArgsecondArg等,甚至可以通过将其作为通用参数提供来获得所需的类型。请注意,我使用invoke使其更具可读性,您也可以将其作为带空括号的普通函数来调用。

答案 1 :(得分:1)

我不得不为回调查找更多示例,并在Kotlin Test with Mockk中找到了一些示例。就我而言,它更具体一些。 我想检查并模拟实现MyCustomCallback的自定义回调实现ListenableFutureCallback onFailure onSuccess 情况。

我的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)
}

答案 2 :(得分:0)

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

val observerMock = mockk<(State) -> Unit>()