【问题标题】:Kotlin - Mockito verify method callsKotlin - Mockito 验证方法调用
【发布时间】:2019-02-13 15:08:23
【问题描述】:

我正在尝试使用 Mockito 编写单元测试。我有一个需要测试的类,如下所示-

open class Employee {
  fun setDetails(name: String, age: Int) {
    setName(name)
    setAge(age)
  }

  fun setName(name: String) { }

  fun setAge(age: Int) { }
}

下面是我的测试类

class EmployeeTest {
  @Mock
  lateinit var emp: Employee

  @Before
  fun setup() {
    MockitoAnnotations.initMocks(this)
  }

  @Test
  fun testDetail() {
    emp.setDetails("Henry", 23)

    verify(emp, times(1)).setAge(23)
  }

}

这是我的问题

当我这样做时-

verify(emp, times(1)).setAge(23)

这给了我一个成功,因为在 Employee.kt 的 setDetails() 中调用了一次 setAge。所以这对我来说很好

但是,当我这样做时-

verify(emp, never()).setAge(23)

这仍然给了我成功,即使在 setDetails() 中调用了该方法。这个测试用例不应该失败吗?

请帮助我理解这一点。我一直无法弄清楚为什么会发生这种情况。

编辑 这对我有用 我使用间谍而不是模拟。但是,我还必须将这些方法声明为在 Kotlin 中打开。

【问题讨论】:

    标签: android testing junit kotlin mockito


    【解决方案1】:

    正如@kcoppock 所述,您的问题包括对模拟的不当使用。您应该使用模拟来消除依赖关系以控制它们的行为。

    在您的情况下,被测单元是 Employee 类及其相关方法。通常,您不想模拟被测单元,因为您想(从您的单元测试中)知道您的类是否按照应有的方式运行。为此,您需要使用Employee 的真实实例,而不是模拟。

    如果您坚持在Employee 实例上使用verify,您可以创建一个spy

    @Test
    fun setDetails_adjustsAge() {
      val employee = spy(Employee())
      employee.setDetails("Henry", 23)
    
      assertEquals(23, employee.age)
      verify(emp, times(1)).setAge(23)
    }
    

    这里有一些参考资料供进一步阅读:

    1. Mockito 关于间谍的官方文档: http://static.javadoc.io/org.mockito/mockito-core/2.24.0/org/mockito/Mockito.html#13

    2. 使用教程Mockito.spy https://www.baeldung.com/mockito-spy

    3. mock 和 spy 的区别:https://www.toptal.com/java/a-guide-to-everyday-mockito

    【讨论】:

    • 你说得对,我必须使用间谍才能让我的用例工作。我之前确实使用过间谍,但对我没有用。我在我的 kotlin 代码中发现了问题。感谢您的提示!
    • @Anirudh 很高兴它对你有用!如果我的回答对您有所帮助,我将不胜感激。
    【解决方案2】:

    所以您的问题是您实际上并不想使用模拟。当您使用模拟时,您需要为在该实例上调用的任何方法定义行为。因此,当您调用emp.setDetails("Henry", 23) 时,该方法没有实现,因此什么也没有发生。 Employee 类中定义的行为将不会被使用,因为emp 只是Employee 的一个假实例,它没有定义任何行为。

    对于您的测试场景,您应该更喜欢使用真实实例并验证最终结果而不是内部行为。例如:

    @Test
    fun setDetails_adjustsAge() {
      val employee = Employee()
      employee.setDetails("Henry", 23)
    
      assertEquals(23, employee.age)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多