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(???)
Ответы
Ответ 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())