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

时间:2018-04-11 08:15:49

标签: android unit-testing lambda kotlin mockito

我需要测试一个接受另一个函数作为参数的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内指定所需的参数,而且我不知道如何指定该函数。

这是正确的方向吗?或者我应该采取另一种方式(可能重新组织代码或做其他魔术)?

非常感谢

1 个答案:

答案 0 :(得分:1)

Mockito.any()需要Class<T>作为第一个参数,因此您要做的是获取Class的{​​{1}}实例。 Kotlin不允许您编写() -> Unit,但 允许您访问基础类(() -> 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)

这就是Mockito-Kotlin为你做的事情。