首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有参数的Kotlin lambda的Mocktito

带有参数的Kotlin lambda的Mocktito
EN

Stack Overflow用户
提问于 2017-01-30 21:26:16
回答 2查看 5.7K关注 0票数 6

我正试着在Kotlin身上测试这个:

代码语言:javascript
复制
verify(myInterface).doSomething(argumentCaptor.capture())
capture.value.invoke(0L)

其中doSomething是:

代码语言:javascript
复制
doSomething((Long) -> Unit)

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

代码语言:javascript
复制
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()必须不是null

我也尝试过集成mockito-kotlin,但是我得到了一个PowerMockito错误:

在org.mockito.internal.MockitoCore的类层次结构中找不到名为"reported“的实例字段。

EN

回答 2

Stack Overflow用户

发布于 2017-01-30 23:16:04

像这样使用莫奇托-科特林似乎很有效:

代码语言:javascript
复制
    val myService = mock<MyInterface>()

    myService.doSomething {
        println(it)
    }

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

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

票数 2
EN

Stack Overflow用户

发布于 2022-04-06 19:33:25

与kotlin 1.3.72和com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0一样,以下内容对我来说很好:

通过val captor = argumentCaptor<() -> Unit>()创建一个参数捕获器,并在其上调用captor.capture()

对于带有nullableArgumentCaptor()的可空捕获者,也有一个变体

下面的单元测试捕获了() -> Unit类型的lambda,它给出了diff.open()。若要在运行时捕获它,则使用captor.capture()

代码语言:javascript
复制
    // given
    val onClose = argumentCaptor<() -> Unit>()
    // when
    diff.open(file, serialized) { onDiffClosed(clusterResource, documentBeforeDiff) }
    // then
    verify(diff).open(any(), any(), onClose.capture())

mockito的nhaarman包装器为mockito类KArgumentCaptor创建一个包装器ArgumentCaptor。nhaarman包装器通过创建一个实例来修复您的错误,而不是像mockito中的null那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41945675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档