如何通过io.mockk测试使用不同参数多次调用的方法?

时间:2019-10-14 10:21:04

标签: unit-testing testing kotlin mockk

PS:代码将在Koltin中

例如,我有一个服务类,它执行某些操作并注入其他服务。

class MyService(
   private val someOtherService: OtherService
) {
   fun doSomething() {
       someOtherService.someMethod("foo")
       someOtherService.someMethod("bar")
       someOtherService.someMethod("baz")
   }
}

这是我的模拟MyService的MyService类的测试:

internal class MyServiceTest {
    @MockkBean(relaxed = true)
    private lateinit var someOtherService: OtherService

    @Test
    fun `my test description`() {
        every { someOtherService.someMethod(any()) } just Runs

        verify(exactly = 1) {
            someOtherService.someMethod(
                    match {
                        it shouldBe "bar"
                        true
                    }
            )
        }
    }

因此,将期望使用"bar"参数,但将改为"foo"参数,并且测试将失败。

原因:someOtherService.someMethod("foo")将在someOtherService.someMethod("bar")之前被呼叫。

但是,我想验证每个方法都调用一次。我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以:

verifySequence {
  someOtherService.someMethod("foo")
  someOtherService.someMethod("bar")
  someOtherService.someMethod("baz")
}

它验证提到的模拟仅执行了指定的调用顺序。

Mockk verification-order

如果没有,则可以使用列表捕获​​参数并稍后验证值。

Mockk capturing