2017-01-25 2 views
2

'then:'セクションの2つのコールをチェックしないと、spockモックが正しい値を返すという奇妙な使用例があります。 'then:'セクションに2つの小切手を入れてください。 は、これはモックです:失敗したセクション:Spockモックが間違った値を返す

mockDao.readCounter(_, _, _, _, _) >> dbValue 

、ここでは 'が':である。この場合

1 * mockDao.readCounter(_, _, _, _, _) 
// updateCounters is called with: sum = dbValue + value 
1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value) 

、代わりに 'DbValueから' のは、 '0' が返されます。しかし、私が2つの小切手のいずれかをコメントアウトすると、それは合格となります。だから、次の2つのケースが合格:

//1 * mockDao.readCounter(_, _, _, _, _) 
// updateCounters is called with: sum = dbValue + value 
1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value) 

OR 

1 * mockDao.readCounter(_, _, _, _, _) 
// updateCounters is called with: sum = dbValue + value 
//1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value) 

ここでスポックのためのGradleセクションです:

// spock 
testCompile "org.codehaus.groovy:groovy:2.4.7" 
compile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.4' 

// !!! To get none-interface base mocking to work with Spock 
compile group: 'cglib', name: 'cglib-nodep', version: '3.2.4' 

答えて

8

これは期待と行動を文書化されています。

モッキングを組み合わせると

モッキングとスタブのスタブ:あなたはモックと同じモック上のスタブしたい場合は、

1 * mockDao.readCounter(_, _, _, _, _) >> dbValue 

ここ

relevant sectionのように1行でそれをしなければなりません

1 * subscriber.receive("message1") >> "ok" 
1 * subscriber.receive("message2") >> "fail" 

同じメソッドコールをモックしてスタブすると、同じ相互作用で起こらなければならない。具体的には、二つの別々のステートメントにスタブやモックの次Mockitoスタイルの分割は動作しません。

setup: 
subscriber.receive("message1") >> "ok" 

when: 
publisher.send("message1") 

then: 
1 * subscriber.receive("message1") 

Where to Declare Interactionsで説明したように、receiveコールは最初then:ブロックにおける相互作用と照合されます。その対話は応答を指定しないため、メソッドの戻り値の型(この場合はnull)のデフォルト値が返されます。 (これは、Spockの嘲笑に対する寛大なアプローチの単なる別の側面です)。したがって、setup:ブロック内の対話は決して一致するチャンスを得ることはありません。

|同じメソッド呼び出しの模擬とスタブが同じインタラクションで行われなければなりません。

関連する問題