模拟 kotlin 函数作为 Android 中的参数



我需要测试一个接受另一个函数作为参数的 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>作为第一个参数,所以你要做的是获取() -> UnitClass实例。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 在引擎盖下为您所做的。

相关内容

  • 没有找到相关文章