Как вызвать лямбда-колбэк с помощью 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)
}
Другие вопросы по тегам