次のように、インターフェイスの実装を引数として取る関数を考えます。
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(???)
nhaarman / mockito-kotlinをお勧めします:KotlinでのMockitoの使用
これは、型パラメーターを具体化したインライン関数によってこれを解決します。
inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)
例えば:
val captor = argumentCaptor<() -> Unit>()
verify(someClass).doSomeThing(captor.capture())
または
val captor: () -> Unit = argumentCaptor()
verify(someClass).doSomeThing(captor.capture())
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加