mockito 带参数的Kotlin lambda的Mocktito参数捕获器

9rbhqvlz  于 2022-11-08  发布在  Kotlin
关注(0)|答案(2)|浏览(180)

我正试图在Kotlin身上测试这一点:

verify(myInterface).doSomething(argumentCaptor.capture())
capture.value.invoke(0L)

doSomething在哪里:

doSomething((Long) -> Unit)

我如何创建一个ArgumentCaptor?现在我正在这样做

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的类层次结构中找不到名为“reported”的示例字段。

o4tp2gmn

o4tp2gmn1#

像这样使用mockito-kotlin看起来是可行的:

val myService = mock<MyInterface>()

    myService.doSomething {
        println(it)
    }

    verify(myService).doSomething(capture { function ->
        function.invoke(123)
    })

编辑:删除了不必要的argumentCaptor<(Long) -> Unit>().apply {}-它没有被使用

0x6upsns

0x6upsns2#

与kotlin1.3.72和com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0一样,以下内容对我来说很好:
通过val captor = argumentCaptor<() -> Unit>()创建一个参数捕获器,并在其上调用captor.capture()
对于nullableArgumentCaptor()的可空捕获器,还有一个变体
下面的单元测试捕获diff.open()() -> Unit类型的lambda。

// given
    val onClose = argumentCaptor<() -> Unit>()
    // when
    diff.open(file, serialized) { onDiffClosed(clusterResource, documentBeforeDiff) }
    // then
    verify(diff).open(any(), any(), onClose.capture())

mockito的nhaarman Package 器为mockito类ArgumentCaptor创建了一个 Package 器KArgumentCaptor。nhaarman Package 器通过创建一个示例而不是mockito中的null来修复您的错误。

相关问题