我正在尝试在 Kotlin 上测试它:
verify(myInterface).doSomething(argumentCaptor.capture())
capture.value.invoke(0L)
哪里做某事:
doSomething((Long) -> Unit)
如何为此创建参数捕获器?现在我正在做这个
inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)!!
val captor = argumentCaptor<(Long) -> Unit>()
verify(mainApiInterface!!).downloadUserProfilePicture(captor.capture())
captor.value.invoke(0L)
但是我得到java.lang.IllegalStateException:captor.capture()不能为空
我也尝试集成mockito-kotlin,但我收到一个PowerMockito错误:
在org.mockito.internal.MockitoCore的类层次结构中找不到名为"report"的实例字段。
像这样使用 mockito-kotlin 似乎有效:
val myService = mock<MyInterface>()
myService.doSomething {
println(it)
}
verify(myService).doSomething(capture { function ->
function.invoke(123)
})
编辑:删除了不必要的argumentCaptor<(Long) -> Unit>().apply {}
- 它没有被使用
与 kotlin 1.3.72 和 com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0 一样,以下内容对我来说很好用:
通过val captor = argumentCaptor<() -> Unit>()
创建一个参数捕获器并对其调用captor.capture()
。
还有一个变体,用于具有nullableArgumentCaptor()
以下单元测试捕获提供给 diff.open()
的 () -> Unit
类型的 lambda。要在运行时捕获它,它使用captor.capture()
// given
val onClose = argumentCaptor<() -> Unit>()
// when
diff.open(file, serialized) { onDiffClosed(clusterResource, documentBeforeDiff) }
// then
verify(diff).open(any(), any(), onClose.capture())
用于 mockito 的 nhaarman 包装器为 mockito 类ArgumentCaptor
创建了一个包装器KArgumentCaptor
。nhaarman 包装器通过创建一个实例而不是像 mockito 那样null
来修复您的错误。