考虑一个将接口实现作为参数的函数,如下所示:
interface Callback {
fun done()
}
class SomeClass {
fun doSomeThing(callback: Callback) {
// do something
callback.done()
}
}
Run Code Online (Sandbox Code Playgroud)
当我想测试这个函数的调用者时,我可以做类似的事情
val captor = ArgumentCaptor.forClass(Callback::class)
Mockito.verify(someClass).doSomeThing(captor.capture())
Run Code Online (Sandbox Code Playgroud)
为了测试调用回调时其他类的作用,我可以这样做
captor.value.done()
Run Code Online (Sandbox Code Playgroud)
问题:如果我用高阶函数替换回调接口,我该怎么做呢?
fun doSomeThing(done: () -> Unit) {
// do something
done.invoke()
}
Run Code Online (Sandbox Code Playgroud)
这可以用ArgumentCaptor来完成,我必须使用哪个类 ArgumentCaptor.forClass(???)
mfu*_*n26 57
我推荐nhaarman/mockito-kotlin:将Mockito与Kotlin一起使用
它通过带有reified类型参数的内联函数解决了这个问题:
inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)
Run Code Online (Sandbox Code Playgroud)
来源:的Mockito-科特林/ ArgumentCaptor.kt在a6f860461233ba92c7730dd42b0faf9ba2ce9281·nhaarman /的Mockito,科特林
例如:
val captor = argumentCaptor<() -> Unit>()
verify(someClass).doSomeThing(captor.capture())
Run Code Online (Sandbox Code Playgroud)
要么
val captor: () -> Unit = argumentCaptor()
verify(someClass).doSomeThing(captor.capture())
Run Code Online (Sandbox Code Playgroud)
我刚才遇到了这个问题,并通过内联解决了argumentCaptor它mockito-kotlin:
argumentCaptor<String>().apply {
verify(myClass, times(2)).setItems(capture())
assertEquals(2, allValues.size)
assertEquals("test", firstValue)
}
Run Code Online (Sandbox Code Playgroud)
firstValue是对第一个捕获的对象的引用。
来源:https ://github.com/mockito/mockito-kotlin/wiki/Mocking-and-verifying#argument-captors
我尝试了@mfulton26 的建议,但收到一条错误消息,说captor.capture() must not be null. 这对我有用。
声明了一个captor带@Captor注解的成员变量,
@Captor private lateinit var captor: ArgumentCaptor<Callback>
Run Code Online (Sandbox Code Playgroud)
在我的@Test 中,
verify(someClass).doSomething(capture(captor))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15604 次 |
| 最近记录: |