使用 mockk 一次只模拟一个电话

mocking only one call at a time with mockk

我知道为了模拟方法的响应方式,您必须使用

every { instanceX.methodB() } returns "42"

我正在尝试模拟一个迭代器,为此你必须模拟 2 个方法 hasNext() 和 next(),如果 hasNext() returns true 总是会有一个无限循环,如果它 return 从一开始就是错误的,next() 不会 return 任何东西。

我的问题是:有没有一种方法可以像在 mockito 中那样用 mockk 一个一个地模拟单个调用?我在文档中找不到任何内容。

使用 returnsManyandThen 构造 return 的 with/instead。

在优秀的 post Mocking is not rocket science 中记录了两个备选方案:

returnsMany 指定一个一个使用的值的数量,即第一个匹配调用 returns 第一个元素,第二个 returns 第二个元素:

    every { mock1.call(5) } returnsMany listOf(1, 2, 3)

您可以使用 andThen 构造实现相同的效果:

    every { mock1.call(5) } returns 1 andThen 2 andThen 3

现在我有一个类似的用例,但对我来说 answers 是合适的解决方案,因为我已经有一个 Iterator (并且 returned 迭代器实际上是Iterator 的自定义扩展名):

every { mock.bogusIterator() /* : CustomIterator */ } answers { 
  val testIterator = testList.iterator() // just an Iterator
  every { hasNext() } answers { testIterator.hasNext() }
  every { next() } answers { testIterator.next() }
}

其中 testList 包含一些预定义的测试值。

returns 始终 returns 是当时赋予函数的值。因此,无论 whatever 是否可变,使用 every { hasNext() } returns whatever 将始终 return 在该模拟声明时 whatever 的值。另一方面,使用 answer 你总是在调用函数时得到你 return 的当前值。万一有人对此感到困惑 ;-) 也许我的进一步解释也有点混乱 :-)