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(???)使用哪个类

我推荐nhaarman / mockito-kotlin:和Kotlin一起使用Mockito

它通过一个带有特定类型参数的内联函数来解决这个问题:

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