【问题标题】:Unit testing - how to test a method that takes in a lambda function?单元测试 - 如何测试采用 lambda 函数的方法?
【发布时间】:2019-02-21 15:51:39
【问题描述】:

谁能帮我弄清楚如何有效地对下面的代码进行单元测试。它的 kotlin 但可以是任何东西:

 myMainObject.doSomethingSpecial({ differentObject ->
                differentObject.doFirst()
                differentObject.doSecond()
                differentObject.doThird()
            })

我想测试 doSomethingSpecial 是否真的有效。

我想过尝试模拟 lambda:

val function1: () -> Int = mock()
    whenever(function1.invoke())
        .thenReturn(1)

但这不是我真正想要的。我想测试 lamda 中的所有方法都被调用,所以我想测试 doFirst、doSecond、doThird 等都被调用,我认为这是最好的单元测试方法。我是否为此使用参数捕获,如何?需要明确的是,我的问题是如何对方法 doSomethingSpecial 进行单元测试?

【问题讨论】:

  • 所以,你会测试 lambda 而不是 doSomethingSpecial,不是吗?可能您可以将 fake lambda 传递给 doSomethingSpecial 方法并测试它在您调用 doSomethingSpecial...时是否被调用...
  • 有趣的想法。所以如果我想在之后测试 lamaba,我将如何测试它是否调用了所有这些方法?

标签: unit-testing lambda junit kotlin


【解决方案1】:

您可以尝试将问题拆分为两个更简单的问题:

  1. 您可以测试doSomethingSpecial(我想它会调用它接收参数的函数)传递一个 fake 函数作为参数并测试它是否被调用
  2. 您可以测试 lambda 并为其命名并将其作为函数进行测试:您调用它为 differentObject 传递 mock 并调用测试 mock 的方法

所以,在伪代码中:

val myFunction = { differentObject ->
        differentObject.doFirst()
        differentObject.doSecond()
        differentObject.doThird()
        differentObject.doFourth()
        differentObject.doFifth()
}
myMainObject.doSomethingSpecial(myFunction)

// Invoke doSomethingSpecial with fake parameter
val fakeFunction = ...
myMainObject.doSomethingSpecial(fakeFunction)
// Assert fakeFunction was called

// Invoke myFunction with mock parameter
val mockObject = ...
myFunction(mockObject)
// Assert mockObject.doNth was called

我希望这种方法可以帮助您找到真正的解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多