ScalaMock:如何模拟/存根一个方法,以便每次调用返回不同的值



使用ScalaMock,我想模拟/存根一个类方法,这样它每次调用都会返回不同的值(调用顺序很重要)。

我可以使用mockexpects来实现这一点,但这将迫使我验证这些调用。

我可以用stub吗?

此外,我怎么能说"第一次返回X,然后总是返回Y"之类的话(同时使用mockstub)?

是的,这是可以做到的,尽管语法有点不直观:

    trait Foo { def getInt: Int }
    val fooStub = stub[Foo]
    (fooStub.getInt _).when().returns(1).noMoreThanOnce()
    (fooStub.getInt _).when().returns(2).noMoreThanOnce()
    (fooStub.getInt _).when().returns(3)
    (fooStub.getInt _).when().returns(4)
    assert(fooStub.getInt == 1)
    assert(fooStub.getInt == 2)
    assert(fooStub.getInt == 3)
    // Note that it's fine that we don't call it a fourth time - calls are not verified.

使用.noMoreThanOnce()而不是.one()非常重要,否则会导致调用被验证。还有一个.noMoreThantTwice()方法,但我认为没有.noMorethantimes()或任何等效方法。


以下是如何对mock和stub执行"第一次返回X,然后始终返回Y":

    trait Bar { def getString: String }
    val barMock = mock[Bar]
    (barMock.getString _).expects().returning("X")
    (barMock.getString _).expects().returning("Y").anyNumberOfTimes()
    assert(barMock.getString == "X")
    assert(barMock.getString == "Y")
    assert(barMock.getString == "Y")
    val barStub = stub[Bar]
    (barStub.getString _).when().returns("x").noMoreThanOnce()
    (barStub.getString _).when().returns("y")
    assert(barStub.getString == "x")
    assert(barStub.getString == "y")
    assert(barStub.getString == "y")

对我来说,编写一个不验证调用并且返回值取决于输入的mock的最佳方法是使用onCall方法——它需要函数的闭包。默认情况下,它将只服务于第一个调用,因此请确保添加anyNumberOfTimes或一些repreted(...)

import org.scalamock.scalatest.MockFactory
trait Foo {
  def getSomeValue(param1: Any, param2: Any): String
}
class Test extends MockFactory {
  val fooMock = stub[Foo]
  val it = Iterator.single("X") ++ Iterator.continually("Y")
  (fooMock.getSomeValue _)
    .expects(*, *)
    .onCall((p1, p2) => it.next())
    .anyNumberOfTimes
}

现在,对fooMock.someValue(...)的第一次调用将返回X和每个连续的Y

相关内容

  • 没有找到相关文章

最新更新