【问题标题】:How to mock lambda with mockito in kotlin如何在 kotlin 中使用 mockito 模拟 lambda
【发布时间】:2019-04-17 19:31:56
【问题描述】:

我有一个 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 表示未解析的引用函数。

任何帮助表示赞赏。

【问题讨论】:

  • 你为什么要费心模拟它而不是编写一个自己验证的函数?
  • Mockito 负责等待结果,因为它是异步的。如果我必须自己这样做,我将不得不使用一些未来的对象或者等待并通知。

标签: kotlin mockito


【解决方案1】:

这与模拟任何其他类型真的没有什么不同:

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

getCompositons(callback)

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

(如果你不知道,我在这里使用mockito-kotlin bindings。)

【讨论】:

  • 哦,有趣的图书馆。晚饭后我试试,谢谢。因为没有库就不行了^^
  • @findusl - 这是公平的,我已经使用这个库很久了,我已经忘记了没有它的生活是什么样的 :)
【解决方案2】:

你可以这样做:

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

getCompositons(callback)

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

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

【讨论】:

  • 我试过这个但得到“无法模拟/间谍类 MyTest$myTestMethod$function$1。Mockito 无法模拟/间谍因为:- final class”错误发生在代码 sn-p 的第二行.基本上,Kotlin 分配给此类回调的类似乎是最终类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多