2016-08-02 60 views
11

考虑一个函数,它的接口实现作为这样一个论点:的Mockito ArgumentCaptor的科特林功能

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

回答

26

使用我建议nhaarman/mockito-kotlin: Using Mockito with Kotlin

它解决了这个通过inline functionreified 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()) 
+0

我已经有了这个库,你可以提供一个例子,如何使用ArgumentCaptor调用一个函数,被传递给模拟? – FWeigl

+0

更新了一个例子。 – mfulton26

+3

我越来越captor.capture()不能为空:( –