【问题标题】:Can you verify a property setter using mockk?您可以使用 mockk 验证属性设置器吗?
【发布时间】:2020-05-14 15:27:02
【问题描述】:

我们在 Java 和 Mockito 中进行了一些测试,我们正在逐步将其转换为 Kotlin 和 Mockk。不过有一个问题。这条简单的线:

verify(mockedInteractor).setIndex(1);

当我们把它移到 mockk 时,我们得到这个:

verify { mockedInteractor.index = 1 }

这当然通过了测试,因为它实际上并没有检查 index 是否设置为 1。它只是将模拟变量设置为 1。下面的效果相同。

verify { mockedInteractor.setIndex(1) }

有没有办法验证setter?

【问题讨论】:

    标签: kotlin verify mockk


    【解决方案1】:

    您可以尝试捕获:

    val fooSlot = slot<String>()
    val mockBar = mockk<Bar>()
    every { mockBar.foo = capture(fooSlot) } answers { }
    assertEquals(fooSlot.captured, "expected")
    

    【讨论】:

    • 哇,谢谢!您还可以使用“just runs”来代替空答案:every { mockBar.foo = capture(fooSlot) } just runs
    • 这是关于验证返回 Unit 的函数的 Mockk 文档,包括 @BrunoPereira 关于使用 just Runs 的评论。 mockk.io/#returning-unit
    【解决方案2】:

    是的,你可以:

    verify { mockedInteractor setProperty "index" value 1 }
    

    这里有更多例子https://mockk.io/#private-functions-mocking--dynamic-calls

    【讨论】:

      【解决方案3】:

      没有硬编码字符串的紧凑解决方案:

      verify { mockedInteractor setProperty MockedInteractor::index.name value 1 }
      

      其中MockedInteractormockedInteractor

      【讨论】:

        【解决方案4】:

        您现在可以在定义模拟时放宽对单元函数的这一要求。

        val foo = mockk<Foo>(relaxUnitFun = true)
        

        在您的模拟上启用此设置意味着您在调用验证单元函数时不需要使用justRun 或该代码的任何变体(根据Mockk documentation)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          • 2011-07-24
          • 1970-01-01
          • 2012-01-30
          • 2021-12-11
          • 2020-07-27
          相关资源
          最近更新 更多