Mocktito ArgumentCaptor for Kotlin lambda with arguments



我正在尝试在 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来修复您的错误。

相关内容

  • 没有找到相关文章

最新更新