我知道为了模拟方法的响应方式,您必须使用
every { instanceX.methodB() } returns "42"
我试图模拟一个迭代器,你必须模拟2个方法hasNext()和next(),如果hasNext()总是返回true,就会有一个无限循环,如果它从一开始就返回false,next()不会返回任何东西。
我的问题是:有没有办法用 mocki 一个一个地模拟单个调用,就像你可以在 mockito 中那样?我在文档中找不到任何内容。
我知道为了模拟方法的响应方式,您必须使用
every { instanceX.methodB() } returns "42"
我试图模拟一个迭代器,你必须模拟2个方法hasNext()和next(),如果hasNext()总是返回true,就会有一个无限循环,如果它从一开始就返回false,next()不会返回任何东西。
我的问题是:有没有办法用 mocki 一个一个地模拟单个调用,就像你可以在 mockito 中那样?我在文档中找不到任何内容。
在出色的帖子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
使用returnsMany
或andThen
构造与/代替return
.
现在我有一个类似的用例,但对我来说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
你总是得到调用函数时返回的当前值。万一有人对此感到困惑;-)也许我的进一步解释也有点令人困惑:-)