一次只嘲笑一个电话

Bad*_*ler 3 unit-testing kotlin mockk

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

every { instanceX.methodB() } returns "42"
Run Code Online (Sandbox Code Playgroud)

我正在尝试模拟一个迭代器,为此您必须模拟2个方法hasNext()和next(),如果hasNext()返回true,则始终会有一个无限循环,如果从头开始返回false,则next()不会返回任何东西。

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

p3q*_*uod 32

这篇优秀的帖子中,嘲笑不是火箭科学记录了两种选择:

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

    every { mock1.call(5) } returnsMany listOf(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

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

    every { mock1.call(5) } returns 1 andThen 2 andThen 3
Run Code Online (Sandbox Code Playgroud)


小智 6

与一起使用returnsManyandThen构建或代替return


Rol*_*and 5

现在我有一个类似的用例,但对我来说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() }
}
Run Code Online (Sandbox Code Playgroud)

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

returns始终返回当时赋予函数的值。因此 usingevery { hasNext() } returns whatever将始终返回模拟声明时的值whatever,无论whatever是否可变。另一方面,answer您始终可以获得调用函数时返回的当前值。万一有人对此感到困惑;-)也许我的进一步解释也有点令人困惑:-)