gpt4 book ai didi

unit-testing - 函数参数和对象的 Kotlin 单元测试

转载 作者:行者123 更新时间:2023-12-02 12:43:58 24 4
gpt4 key购买 nike

在 Kotlin 中,我们可以有函数对象并作为函数参数传入。

  • 如何创建单元测试来测试功能对象逻辑? (例如 funcParam 下面)
  • 如何对具有函数参数的函数进行单元测试? (例如 functionWithFuncParam 下面)- 即我可以为 funcParam 创建一个 Mock 吗? ?
    class MyClass1(val myObject: MyObject) {
    val funcParam = fun (num: Int): Int {
    return num * num
    }

    fun myFunctionOne() {
    myObject.functionWithFuncParam(funcParam)
    }
    }

    class MyObject () {
    fun functionWithFuncParam(funcParam: (Int) -> Int) {
    println(funcParam(32))
    }
    }
  • 最佳答案

    假设 funcParampublic 故意你可以测试它作为任何其他方法:

    class MyClass1Tests {
    val sut = MyClass1(MyObject())

    @Test
    fun `funcParam multiplies input`() {
    assertThat(sut.funcParam(4), equalTo(16))
    assertThat(sut.funcParam(1), equalTo(1))
    assertThat(sut.funcParam(0), equalTo(0))
    assertThat(sut.funcParam(-10), equalTo(100))
    }
    }

    如果 funcParam 是私有(private)的,则不应直接测试其行为,而应仅通过其包含类的公共(public)接口(interface)进行测试。

    在测试 functionWithFuncParam 时,您可以轻松地提供 (Int) -> Int 的 stub 实现:
    class MyObjectTests {
    val outContent = ByteArrayOutputStream().apply {
    System.setOut(PrintStream(this))
    }
    val sut = MyObject()
    @Test
    fun `functionWithFuncParam prints function output `() {
    sut.functionWithFuncParam { 12345678 }
    assertThat(outContent.toString(), containsString("12345678"))
    }
    }

    如果您想测试 MyClass1MyObject 的交互,一种方法是使用在 MyObject 中实现的 MyClass1 接口(interface)。如果 2 个类是不同的合作者,从某种意义上说,它们具有独立的大部分不相关的行为,通常是最佳选择:
    interface FunctionalObj {
    fun functionWithFuncParam(funcParam: (Int) -> Int)
    }
    class MyClass1(val myObject: FunctionalObj) {
    //omitted for brevity
    }
    class MyClass1Tests {
    var params = mutableListOf<(Int)->Int>()
    val sut = MyClass1(object: FunctionalObj {
    override fun functionWithFuncParam(funcParam: (Int) -> Int) { params.add(funcParam) }
    })

    @Test
    fun `myFunctionOne calls delegate`() {
    sut.myFunctionOne()
    assertThat(params.size, equalTo(1))
    assertThat(params[0], equalTo(sut.funcParam))//only if `funcParam` is public
    }
    }

    如果 MyClass1MyObject 交互更复杂(即涉及更多调用 queries and commands ),则意味着它们是密切合作的对等方。在这种情况下,使用 mock 会导致测试变得脆弱且难以编写。

    关于unit-testing - 函数参数和对象的 Kotlin 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37655431/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com