Kotlin -Mockito验证方法调用



我正在尝试与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()中,套装被称为一次。这样对我来说很好

但是,当我做 -

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

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

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

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

如@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/mockito.html#13

  2. 有关如何使用Mockito.spy的教程https://www.baeldung.com/mockito-spy

  3. 模拟与间谍之间的差异:https://www.toptal.com/java/a-guide-to-to-everyday-mockito

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

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

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

相关内容

  • 没有找到相关文章

最新更新