使用 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 一个一个地模拟单个调用?我在文档中找不到任何内容。
使用 returnsMany
或 andThen
构造 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 的当前值。万一有人对此感到困惑 ;-) 也许我的进一步解释也有点混乱 :-)
我知道为了模拟方法的响应方式,您必须使用
every { instanceX.methodB() } returns "42"
我正在尝试模拟一个迭代器,为此你必须模拟 2 个方法 hasNext() 和 next(),如果 hasNext() returns true 总是会有一个无限循环,如果它 return 从一开始就是错误的,next() 不会 return 任何东西。
我的问题是:有没有一种方法可以像在 mockito 中那样用 mockk 一个一个地模拟单个调用?我在文档中找不到任何内容。
使用 returnsMany
或 andThen
构造 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 的当前值。万一有人对此感到困惑 ;-) 也许我的进一步解释也有点混乱 :-)