1

「where」句のテーブルでモックオブジェクトを使用しようとしています。基本的にこのようなもの:

def "my test"(){

    given:
    InjectedObject1 inj1 = Mock()
    InjectedObject2 inj2 = Mock()
    SystemUnderTest system = new System(inj1, inj2)
    MockedObject mocked = Mock()

    inj1.someMethod() >> list  // this will be a list of MockedObject

    when:
    system.execute()

    then:
    n * inj2.someOtherMethod()

    where:
    list             | n
    [mocked]         | 0
    [mocked, mocked] | 1
}

「where」句は「given」句の前に実行されるため、これmockedは機能しません。したがって、最初に参照されたときにはまだ存在していません。どうすればこれを克服できますか?mocked使用されているのはこのテストだけなので、このメソッドの外で作成することは避けたいと思います。

これは単純化された例であり、実際にはより多くの相互作用があり、テーブル内の他の列がn-に影響を与えるため、テーブルの構文が非常に便利になることに注意してください。

4

1 に答える 1

3

メソッドを次のようにリファクタリングできます。

...
inj1.someMethod() >> [mocked] * numReturned
...
then:
numCalled * inj2.someOtherMethod()

where:
numReturned | numCalled
1           | 0
2           | 1

つまり、where-block でパーツを (そのまま) 指定し、メソッド本体で組み立てます。これは一般的な解決策です。

通常、別の解決策は、where ブロックで使用されるオブジェクトを@Sharedフィールドにシャッフルすることです。「スコープが大きすぎる」問題は、同じファイルに複数の小さなスペックを含めることで軽減できます。ただし、モックは にできないため、このソリューションはモックには機能しません@Shared

于 2012-01-25T02:00:24.140 に答える