Spock mock returns 错误的值
Spock mock returns wrong value
我有一个奇怪的用例,当我没有检查 'then:' 部分中模拟 class 上的两个调用时,spock mock 返回了正确的值,但它返回了 0当我在 'then:' 部分包含两个支票时。
这是模拟:
mockDao.readCounter(_, _, _, _, _) >> dbValue
这里是失败的 'then:' 部分:
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)
这是 spock 的 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'
这是预期的记录行为。如果你想在同一个模拟上模拟和存根,你必须像
这样在一行中完成
1 * mockDao.readCounter(_, _, _, _, _) >> dbValue
这里是relevant section:
结合模拟和存根
嘲笑和打桩去 hand-in-hand:
1 * subscriber.receive("message1") >> "ok"
1 * subscriber.receive("message2") >> "fail"
当模拟和存根相同的方法调用时,它们必须发生在相同的交互中。特别是,以下 Mockito-style 将存根和模拟分成两个单独的语句将不起作用:
setup:
subscriber.receive("message1") >> "ok"
when:
publisher.send("message1")
then:
1 * subscriber.receive("message1")
如 Where to Declare Interactions 中所述,receive
调用将首先与 then:
块中的交互进行匹配。由于该交互未指定响应,因此方法的 return 类型(在本例中为 null
)的默认值将被 returned。 (这只是 Spock 宽容的嘲讽方式的另一个方面。)。因此,setup:
块中的交互永远不会有机会匹配。
注意 |同一方法调用的模拟和存根必须在同一交互中发生。
我有一个奇怪的用例,当我没有检查 'then:' 部分中模拟 class 上的两个调用时,spock mock 返回了正确的值,但它返回了 0当我在 'then:' 部分包含两个支票时。 这是模拟:
mockDao.readCounter(_, _, _, _, _) >> dbValue
这里是失败的 'then:' 部分:
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)
这是 spock 的 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'
这是预期的记录行为。如果你想在同一个模拟上模拟和存根,你必须像
这样在一行中完成1 * mockDao.readCounter(_, _, _, _, _) >> dbValue
这里是relevant section:
结合模拟和存根
嘲笑和打桩去 hand-in-hand:
1 * subscriber.receive("message1") >> "ok"
1 * subscriber.receive("message2") >> "fail"
当模拟和存根相同的方法调用时,它们必须发生在相同的交互中。特别是,以下 Mockito-style 将存根和模拟分成两个单独的语句将不起作用:
setup:
subscriber.receive("message1") >> "ok"
when:
publisher.send("message1")
then:
1 * subscriber.receive("message1")
如 Where to Declare Interactions 中所述,receive
调用将首先与 then:
块中的交互进行匹配。由于该交互未指定响应,因此方法的 return 类型(在本例中为 null
)的默认值将被 returned。 (这只是 Spock 宽容的嘲讽方式的另一个方面。)。因此,setup:
块中的交互永远不会有机会匹配。
注意 |同一方法调用的模拟和存根必须在同一交互中发生。