2012-01-25 3 views
1

私は、どこの句のテーブルに虚偽のオブジェクトを使用しようとしています。基本的にはこのような何か:Spock: "Where"句テーブルの中のMockを使用していますか?

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 
} 

「どこで」句が「与えられた」節の前に実行され、それが最初に参照されたときにmockedがまだ存在していないので、これは動作しません。どのように私はこれを克服するのですか? mockedはこのテストだけですので、このメソッド以外では作成しないでください。

これは単純な例です。実際にはより多くのやりとりがあり、テーブルの他の列はnに影響します。これはテーブル構文を非常に便利にします。

答えて

2

あなたが好きなものにする方法をリファクタリングすることができますつまり

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

where: 
numReturned | numCalled 
1   | 0 
2   | 1 

、(単なる)ここで、ブロック内の部品を指定し、メソッド本体でそれらを組み立てます。これは一般的な解決策です。

通常、別の解決策は、whereブロックで使用するオブジェクトをシャッフルして@Sharedフィールドにすることです。 「大きすぎる範囲」の問題は、同じファイル内に複数の小さな仕様を持つことで軽減できます。しかし、モックは@Sharedにできないので、この解決法はモックのためには機能しません。

+0

私はこれについて考えていましたが、私の場合はうまくいくでしょうが、もしこのリストがもっと複​​雑でなければならないのですか?確かに、あなたのソリューションの一般化として、 "where"テーブルのintを使用し、必要なモックを生成するために "given"節にスイッチを置くことができますが、それはniceテーブル構文の目的を打ち負かします... –

+0

すべてのツールには限界があります。 http://issues.spockframework.orgで機能リクエストを提出してください。 –

+0

[完了](http://code.google.com/p/spock/issues/detail?id=224):) Spock @peterに感謝します。 –

関連する問題