我需要测试一个接受另一个函数作为参数的 Kotlin 函数。该类如下所示:
class MyClass(val myInstance: MyObject) {
fun toBeTested(text: String, number: Int) {
myInstance.doSomething(text, otherFunction(number))
...
}
}
到目前为止,我的测试看起来像这样
@Test
fun testFunction() {
val mockInstance = mock(MyObject::class.java)
myClass.toBeTested("test", 15)
}
我想使用verify(mockInstance, times(1)).doSomething()
,但我需要在doSomething
内部指定它需要的参数,而且我不知道如何指定函数。
这是正确的方向吗?或者我应该采取另一种方式(也许是重新组织代码或做一些其他魔法(?
非常感谢
>Mockito.any()
需要一个Class<T>
作为第一个参数,所以你要做的是获取() -> Unit
的Class
实例。Kotlin 不允许你编写(() -> Unit)::class.java
,但它确实允许你访问底层的() -> Unit
类: Function0
。
因此,要获得所需的Class<() -> Unit>
,您可以执行以下操作:
val f : Class<() -> Unit> = Function0::class.java as Class<Function0<Unit>>
您可以将此类传递给any
调用:
verify(mockInstance, times(1)).doSomething(any(f))
现在这不是很漂亮,所以你可以定义一个自定义any()
函数来为你完成所有这些魔术:
inline fun <reified T : Any> myAny() = Mockito.any(T::class.java)
这使您可以执行以下操作:
verify(mockInstance, times(1)).doSomething(myAny<() -> Unit>())
// or:
verify(mockInstance, times(1)).doSomething(myAny())
这就是 Mockito-Kotlin 在引擎盖下为您所做的。