Mockito ArgumentCaptor for Kotlin功能

asc*_*sco 35 mockito kotlin

考虑一个将接口实现作为参数的函数,如下所示:

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)

  • 我得到captor.capture()一定不能为null :( (21认同)
  • 来自Mockito-Kotlin的Wiki具有一些使用捕获程序的有趣语法:https://github.com/nhaarman/mockito-kotlin/wiki/Mocking-and-verifying#argument-captors (3认同)

tom*_*ulo 6

我刚才遇到了这个问题,并通过内联解决了argumentCaptormockito-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


Nar*_*hin 5

我尝试了@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)

  • 这将返回`java.lang.IllegalStateException: callbackCaptor.capture() must not be null` (12认同)