考虑一个将接口(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 function与reified 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())