如何验证特定的lambda方法是否已作为参数传递给mockito

时间:2018-03-23 16:46:54

标签: android unit-testing kotlin mockito kotlintest

我有一个Kotlin类(问题被简化为有一个基本的例子),其中有一个方法testedMethod()我想测试交互。

我想确保将正确的参数传递给anotherMethod(),我的问题是参数不是而是 lambda函数。< / p>

我正在寻找Kotlin的一个简单解决方案,它可能会也可能不会基于this solution for java

class TestedClass {

    fun testedMethod() {
        anotherMethod({ passedMethod() })
    }

    fun passedMethod() {}

    fun anotherMethod(lambdaParameter: () -> Unit) {
        // Does something with lambdaParameter
    }
}

2 个答案:

答案 0 :(得分:1)

这是我最终使用的解决方案。

基本上,您创建了一个spy测试类,以便能够验证自己的方法,并使用argumentCaptor捕获传递的lambda,并能够调用其中的内容。

import com.nhaarman.mockito_kotlin.argumentCaptor
import com.nhaarman.mockito_kotlin.spy
import com.nhaarman.mockito_kotlin.verify

@Test
fun lambdaParameterPassedIsCorrect() {
    val testedClass = TestedClass()
    val spyOfTestedClass = spy(testedClass)

    val captor = argumentCaptor<() -> Unit>()

    spyOfTestedClass.testedMethod()

    verify(spyOfTestedClass).anotherMethod(captor.capture())
    // Invoke the function passed as a parameter 
    // and then verify that the expected method was called
    val function = captor.firstValue
    function.invoke()
    verify(spyOfTestedClass).passedMethod()
}

我仍然会对更简单的解决方案感兴趣。

答案 1 :(得分:0)

你可以使用mockito_kotlin库,它具有&#34;验证&#34;。

  verify(TestedClass, times(1)).anotherMethod(eq(passedMethod))

哪个验证方法&#34; anotherMethod&#34; class&#34; TestedClass&#34;使用等于&#34; passedMethod&#34;

的参数调用一次