31

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

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

我试图模拟一个迭代器,你必须模拟2个方法hasNext()和next(),如果hasNext()总是返回true,就会有一个无限循环,如果它从一开始就返回false,next()不会返回任何东西。

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

4

3 回答 3

47

在出色的帖子Mocking is not rocket science中记录了两种替代方案:

returnsMany指定一个一个使用的多个值,即第一个匹配的调用返回第一个元素,第二个返回第二个元素:

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

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

    every { mock1.call(5) } returns 1 andThen 2 andThen 3
于 2019-04-27T07:39:34.187 回答
29

使用returnsManyandThen构造与/代替return.

于 2018-09-14T05:27:51.900 回答
3

现在我有一个类似的用例,但对我来说answers是合适的解决方案,因为我已经有了一个合适的解决方案Iterator(并且返回的迭代器实际上是 的自定义扩展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总是返回当时给函数的值。因此 usingevery { hasNext() } returns whatever将始终返回该whatever模拟声明时的值,无论是否whatever可变。另一方面,answer你总是得到调用函数时返回的当前值。万一有人对此感到困惑;-)也许我的进一步解释也有点令人困惑:-)

于 2019-09-19T10:23:30.713 回答