如何在Kotlin中使用Mockito模拟Lambda函数

19

我有一个使用 Kotlin 开发的 Android 应用。这个应用有一个从后端加载组合并将其返回给回调函数的功能:

getCompositons(callback: (Array<Composition>) -> Unit)

如何使用Mockito模拟回调函数,以便我可以做出类似于这样的操作:

var callback = //mockito mock
getCompositons(callback) 
verify(callback, timeout(10000)).apply()

我读到lambda与java类型函数匹配,因此我认为应该调用apply方法。也许我可以模拟一个函数然后使用它?但是Kotlin函数接口似乎只有一个返回类型,没有参数。java.util.Function显示未解决的参考函数。

感谢任何帮助。


你为什么要模拟它,而不是编写一个能够自行验证的函数呢? - Louis Wasserman
Mockito会等待结果,因为它是异步的。如果我必须自己做这件事,我就得使用一些future对象或者可能是wait和notify。 - findusl
3个回答

21

这与对其他类型进行模拟没有任何区别:

val callback = mock<(Array<Composition>) -> Unit>()

getCompositons(callback)

verify(callback)(any())  // Or verify(callback).invoke(any()) to be explicit

如果您不知道它们,我在这里使用的是mockito-kotlin绑定


哦,有趣的库。晚饭后我会试试看,谢谢。因为没有那个库就不行^^ - findusl
@findusl - 这很公平,我使用这个库已经很长时间了,我已经忘记没有它的生活是什么样子了 :) - Oliver Charlesworth

4

您可以像这样做:

val function: Array<Composition>) -> Unit = {}
val callback = mock(function::class.java)

getCompositons(callback)

verify(callback)(any()) // or for example verifyNoInteractions(callback)

除了标准的mockito库之外,不需要额外的库


1
我尝试过这个,但是得到了“无法模拟/监听类MyTest $ myTestMethod $ function $ 1。Mockito无法模拟/监听,因为:- final类”错误发生在您代码片段的第二行。基本上看起来Kotlin分配给这些回调的类是final类。 - Adam Burley

0

我解决了这个问题,通过这样模拟回调函数:

  private val onNewUrl: (url: String) -> Boolean = mock {
    on { mock(any()) } doReturn true
  }

  verify(onNewUrl).invoke(any())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接