2017-01-25 5 views
2

У меня есть странный случай использования, когда spock mock возвращает правильное значение, когда я не проверяю два вызова на классный класс в разделе «then:», но он возвращает 0, когда я включите две проверки в разделе «then:». Это насмешка:Spock mock возвращает неправильное значение

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' возвращается. Но если я прокомментирую одну из двух проверок, она пройдет. Таким образом, следующие два случая проходит:

//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 * 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 в этом случае) будет возвращено. (Это еще один аспект мягкого подхода Спока к насмешкам.). Следовательно, взаимодействие в блоке setup: никогда не будет иметь возможности совпадения.

NOTE | Издевательство и прерывание одного и того же вызова метода должны происходить в одном и том же взаимодействии.

Смежные вопросы