考虑一个将接口实现作为参数的函数,如下所示:
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(???)
中使用哪个类
答案 0 :(得分:51)
我建议nhaarman/mockito-kotlin: Using Mockito with Kotlin
它通过带inline function的reified type parameter来解决此问题:
inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)
e.g:
val captor = argumentCaptor<() -> Unit>()
verify(someClass).doSomeThing(captor.capture())
或
val captor: () -> Unit = argumentCaptor()
verify(someClass).doSomeThing(captor.capture())
答案 1 :(得分:0)
我尝试了@ mfulton26的建议,但收到一条错误消息,内容为captor.capture() must not be null
。这就是对我有用的。
声明了带有captor
批注的成员变量@Captor
,
@Captor private lateinit var captor: ArgumentCaptor<Callback>
在我的@Test中,
verify(someClass).doSomething(capture(captor))
希望有帮助!