How to call a lambda callback with mockk

Janusz picture Janusz · Dec 7, 2018 · Viewed 7.1k times · Source

I create a mock of a class with mockk. On this mock I now call a method that gets a lambda as a parameter.

This lambda serves as a callback to deliver state changes of the callback to the caller of the method.

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

How do I configure the mock to call the passed lambda?

Answer

s1m0nw1 picture s1m0nw1 · Dec 7, 2018

You can use 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
}

Within the answers scope you can access firstArg, secondArg etc and even get the expected type by providing it as a generic parameter. Note that I used invoke to make it more readable, you can also invoke it as a normal function with empty parentheses.