2017-01-25 2 views
2

Ich habe einen seltsamen Anwendungsfall, in dem Spock Mock den richtigen Wert zurückgibt, wenn ich im Abschnitt "then:" nicht nach zwei Aufrufen der gespielten Klasse suche, aber 0 zurückgibt, wenn ich Fügen Sie im Abschnitt "then:" zwei Überprüfungen hinzu. Dies ist das Mock:Spock Mock gibt falschen Wert zurück

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

und hier ist der 'dann:' Abschnitt, den fehlschlägt:

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

In diesem Fall statt 'dbValue', '0' zurückgegeben. Aber wenn ich einen der beiden Checks auszeichne, vergeht es. So gehen die beiden folgenden Fällen:

//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) 

Hier ist der gradle Abschnitt für spock:

// 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' 

Antwort

8

Dies ist zu erwarten und dokumentierte Verhalten. Wenn Sie auf demselben Mock verspotten und Stub wollen, müssen Sie es in einer Zeile tun, wie

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

Hier die relevant section:

Kombination Mocking und Stubbing

Mocking und Anstoßen gehen Hand in Hand:

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

Wenn Sie sich verspotten und stubben die gleiche Methode, sie müssen in der gleichen Interaktion passieren. Insbesondere arbeitet die folgende Mockito-Stil Spaltung von Anstoßen und spöttisch in zwei getrennte Aussagen nicht:

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

when: 
publisher.send("message1") 

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

Wie in Where to Declare Interactions erklärt, der receive Anruf wird zunächst gegen die Interaktion im then: Block abgestimmt bekommen. Da diese Interaktion keine Antwort angibt, wird der Standardwert für den Rückgabetyp der Methode zurückgegeben (in diesem Fall null). (Dies ist nur eine weitere Facette von Spocks milderen Herangehensweise an Spott.). Daher wird die Interaktion im setup: Block niemals eine Chance bekommen, übereinzustimmen.

HINWEIS | Verspotten und Stubben des gleichen Methodenaufrufs muss in der gleichen Interaktion geschehen.

Verwandte Themen