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