考虑一个将接口(interface)实现作为参数的函数,如下所示:

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()

问题:如果我将回调接口(interface)替换为高阶函数(例如
fun doSomeThing(done: () -> Unit) {

    // do something

    done.invoke()

}

可以用ArgumentCaptor做到吗,我必须在ArgumentCaptor.forClass(???)中使用什么类

最佳答案

我推荐nhaarman/mockito-kotlin: Using Mockito with Kotlin

它通过使用inline functionreified type parameter来解决此问题:

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())

09-12 04:23