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()不能爲空:( –