unit-testing - 单元测试-如何测试采用lambda函数的方法?

标签 unit-testing lambda junit kotlin

有人可以帮助我弄清楚如何对以下代码进行有效的单元测试。它的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进行单元测试?

最佳答案

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

  • ,您可以测试doSomethingSpecial(我想称它为接收参数的函数),并通过一个伪函数作为参数进行测试,并将其称为
  • ,您可以测试lambda,并为其命名并测试其功能:您将其传递给differentObject并通过模拟进行了测试,并将测试模拟的方法称为

  • 因此,用伪代码:
    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
    

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

    关于unit-testing - 单元测试-如何测试采用lambda函数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54811098/

    相关文章:

    java - 如何使用 JUnit 高效地测试方法

    java - Resteasy异常 "No type information to extract entity with, use other getEntity() methods"

    ios - 为什么某些功能覆盖率已经是 100% xcode 9

    c# - 为什么此 CollectionAssert.AreEquivalent() 测试失败?

    unit-testing - 使用模拟对象编写可维护的单元测试

    c# - 输入为空的 Lambda 表达式

    android - JUnit 断言 Activity 是接口(interface)的实现

    unit-testing - 找不到Gradle命令行 Assets 中的Libgdx测试

    python - 在 python 3 中将循环转换为 lambda 以返回 true 或 false 而不使用过滤器方法?

    java - Android lambda 表达式设置