【问题标题】:How to verify that a specific lambda method has been passed as argument with mockito如何验证特定的 lambda 方法是否已作为参数传递给 mockito
【发布时间】:2018-03-23 16:46:54
【问题描述】:

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

我想确保将正确的参数传递给anotherMethod(),我的问题是该参数不是而是lambda函数

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

class TestedClass {

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

    fun passedMethod() {}

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

【问题讨论】:

  • 如果在 anotherMethod 中使用/调用 lambda,则模拟 passedMethod。之后您可以练习testedMethod,然后验证模拟的passedMethod 是否被调用。

标签: android unit-testing kotlin mockito kotlintest


【解决方案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()
}

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

【讨论】:

  • 我尝试根据您的回答执行我的案例但失败了,例如 val captor = argumentCaptor Unit>() -- 给我一个错误
【解决方案2】:

您可以使用具有“验证”功能的 mockito_kotlin 库。

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

验证类“TestedClass”的方法“anotherMethod”调用一次,参数等于“passedMethod”

【讨论】:

  • 您能否提供一个代码示例,其中包含完整的编译语法以及测试通过的位置?我认为在发布这个问题之前会那么容易;)
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2023-03-07
  • 2013-01-24
相关资源
最近更新 更多