我知道,为了模拟方法的响应方式,您必须使用
class PointClassFixed implements Point {
readonly x: number;
readonly y: number;
constructor(x: number, y: number) {
this.x = x
this.y = y
}
changeCoordinates(x: number, y: number): void {
this.x = x // error!
this.y = y // error!
}
}
我正在尝试模拟一个迭代器,为此您必须模拟2个方法hasNext()和next(),如果hasNext()返回true,则始终会有一个无限循环,如果从头开始返回false, next()将不返回任何内容。
我的问题是:有没有一种方法可以像在ockito中一样用ockock来模拟单个呼叫?我在文档中找不到任何内容。
答案 0 :(得分:5)
将returnsMany
或andThen
构造与/代替return
一起使用。
答案 1 :(得分:1)
在出色的帖子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
答案 2 :(得分:0)
现在我有一个类似的用例,但对我来说answers
是合适的解决方案,因为我已经有了Iterator
(返回的迭代器实际上是{{1 }}):
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
将始终在该模拟声明时返回every { hasNext() } returns whatever
的值,而不管whatever
是否可变。另一方面,使用whatever
总是可以得到调用函数时返回的当前值。万一有人对它感到困惑;-)也许我的进一步解释也有些混乱:-)