Как вызвать лямбда-колбэк с помощью mockk
Я создаю макет класса с mockk. На этом макете я теперь вызываю метод, который получает лямбду в качестве параметра.
Эта лямбда-функция служит в качестве обратного вызова для доставки изменений состояния обратного вызова вызывающей стороне метода.
class ObjectToMock() {
fun methodToCall(someValue: String?, observer: (State) -> Unit) {
...
}
}
Как мне настроить макет для вызова пройденной лямбды?
3 ответа
Ты можешь использовать 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
чтобы сделать его более читабельным, вы также можете вызывать его как обычную функцию с пустыми скобками.
Возможно, это не совсем то, о чем вы спрашиваете, но вы можете использовать тип funciton для макета:
val observerMock = mockk<(State) -> Unit>()
Мне пришлось поискать еще один пример обратного вызова, и я нашел его в Kotlin Test with Mockk. В моем случае это немного конкретнее. Я хотел проверить и поиздеваться над случаями onFailure и onSuccess пользовательской реализации обратного вызова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)
}