Подтвердить что ты не робот

Mockito ArgumentCaptor для функции Kotlin

Рассмотрим функцию, которая реализует реализацию интерфейса как аргумент следующим образом:

interface Callback {
    fun done()
}

class SomeClass {        

    fun doSomeThing(callback: Callback) {

        // do something

        callback.done()

    }    
}

Когда я хочу проверить вызывающую эту функцию, я могу сделать что-то вроде

val captor = ArgumentCaptor.forClass(Callback::class)
Mockito.verify(someClass).doSomeThing(captor.capture())

Чтобы проверить, что делает другой класс при вызове обратного вызова, я могу сделать

captor.value.done()

Вопрос: Как я могу сделать то же самое, если я заменил интерфейс обратного вызова функцией высокого порядка, например

fun doSomeThing(done: () -> Unit) {

    // do something

    done.invoke()

}

Можно ли это сделать с помощью ArgumentCaptor и какой класс я должен использовать в ArgumentCaptor.forClass(???)

4b9b3361

Ответ 1

Я рекомендую nhaarman/mockito-kotlin: Использование Mockito с Kotlin

Он решает это с помощью встроенной функции с параметром reified type:

inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)

Источник: mockito-kotlin/ArgumentCaptor.kt at a6f860461233ba92c7730dd42b0faf9ba2ce9281 · nhaarman/mockito-kotlin

например:.

val captor = argumentCaptor<() -> Unit>()
verify(someClass).doSomeThing(captor.capture())

или

val captor: () -> Unit = argumentCaptor()
verify(someClass).doSomeThing(captor.capture())