如何使用 mockk 调用 lambda 回调
How to call a lambda callback with mockk
我用 mockk 创建了一个 class 的模拟。
在这个模拟中,我现在调用一个获取 lambda 作为参数的方法。
此 lambda 用作回调,将回调的状态更改传递给方法的调用者。
class ObjectToMock() {
fun methodToCall(someValue: String?, observer: (State) -> Unit) {
...
}
}
如何配置 mock 以调用传递的 lambda?
您可以使用 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
、secondArg
等,并通过将其作为通用参数提供来获得预期类型。请注意,我在这里明确使用 invoke
以使其更具可读性,也可以省略
我不得不为回调寻找更多示例,并在 Kotlin Test with Mockk 中找到了一些示例。就我而言,它更具体一些。
我想检查和模拟 onFailure 和 onSuccess 自定义回调实现 MyCustomCallback
实现 ListenableFutureCallback
的情况。
我的 ExampleProducer
class 的代码看起来像具有 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)
}
也许不完全是你问的,但你可以使用模拟的函数类型:
val observerMock = mockk<(State) -> Unit>()
我用 mockk 创建了一个 class 的模拟。 在这个模拟中,我现在调用一个获取 lambda 作为参数的方法。
此 lambda 用作回调,将回调的状态更改传递给方法的调用者。
class ObjectToMock() {
fun methodToCall(someValue: String?, observer: (State) -> Unit) {
...
}
}
如何配置 mock 以调用传递的 lambda?
您可以使用 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
、secondArg
等,并通过将其作为通用参数提供来获得预期类型。请注意,我在这里明确使用 invoke
以使其更具可读性,也可以省略
我不得不为回调寻找更多示例,并在 Kotlin Test with Mockk 中找到了一些示例。就我而言,它更具体一些。
我想检查和模拟 onFailure 和 onSuccess 自定义回调实现 MyCustomCallback
实现 ListenableFutureCallback
的情况。
我的 ExampleProducer
class 的代码看起来像具有 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)
}
也许不完全是你问的,但你可以使用模拟的函数类型:
val observerMock = mockk<(State) -> Unit>()