如何使用mockk调用lambda回调

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

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

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

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

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

kotlin mocking mockk
3个回答
65
投票

您可以使用

answers

val objToMock: ObjectToMock = mockk()
# here we set up the mock to always call the second arg as a function for any arguments passed
every {  objToMock.methodToCall(any(), any())} answers {
    # alternatively: omit `invoke`
    secondArg<(String) -> Unit>().invoke("anything")
}

objToMock.methodToCall("firstArgumentString"){
    # the lambda is passed as a trailing lambda thus outside the parens
    println("invoked with $it")
}

answers
范围内,您可以访问
firstArg
secondArg
、...。要获取预期类型的参数,请将其指定为通用参数(此处:
(String) -> Unit
)。请注意,我在这里明确使用了
invoke
以使其更具可读性,也可以省略。


4
投票

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

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

3
投票

我必须寻找更多回调示例,并在 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.