12

ScalaMock を使用して、クラス メソッドをモック/スタブ化し、呼び出しごとに異なる値を返すようにしたい (呼び出しの順序が重要)。

mockとを使用してこれを実現できますexpectsが、これらの呼び出しを検証する必要があります。

でこれを行うことはできますstubか?

また、「最初に X を返し、次に常に Y を返す」( と の両方mock)のようなことをどのように言うことができstubますか?

4

2 に答える 2

17

はい、構文は少し直感的ではありませんが、これは実行できます。

    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.

.once() ではなく .noMoreThanOnce() を使用することが重要です。そうしないと、呼び出しが検証されます。.noMoreThanTwice() メソッドもありますが、.noMoreThanNTimes() または同等のものはないと思います。


モックとスタブに対して「最初に 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")
于 2016-04-08T00:49:56.490 に答える