【问题标题】:Mocktito ArgumentCaptor for Kotlin lambda with arguments带有参数的 Kotlin lambda 的 Mocktito ArgumentCaptor
【发布时间】:2017-01-30 21:26:16
【问题描述】:

我正在尝试在 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”的实例字段。

【问题讨论】:

  • 仅作记录:PowerMock 对字节码所做的事情在使用纯 java 时会让人头疼。我真的不会将 PowerMockito 与除 javac 之外的其他任何东西生成的字节码一起使用。

标签: android function lambda mockito kotlin


【解决方案1】:

像这样使用mockito-kotlin 似乎可行:

    val myService = mock<MyInterface>()

    myService.doSomething {
        println(it)
    }

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

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

【讨论】:

  • 我认为这是一个很好的解决方案,但问题是我与 PowerMock 有冲突,因为我上面写的,我使用 PowerMock 是因为我正在使用一些静态类
  • 哈哈,那你就靠自己了——有龙!
  • 我错过了什么? capture(ArgumentCaptor&lt;T&gt;) 的参数不是 lambda。
  • 如果您没有使用 mockito-kotlin,请检查此页面上的解决方案,它为我修复了它:) derekwilson.net/blog/2018/10/19/mockito-kotlin-2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多