gpt4 book ai didi

unit-testing - Spock模拟返回错误值

转载 作者:行者123 更新时间:2023-12-04 04:44:21 26 4
gpt4 key购买 nike

我有一个奇怪的用例,当我不检查“then:”部分中对模拟类的两次调用时,spock模拟返回正确的值,但是当我在“then:”部分中进行两次检查时,spock模拟返回0: ' 部分。
这是模拟的:

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

这是失败的“then:”部分:
1 * mockDao.readCounter(_, _, _, _, _)
// updateCounters is called with: sum = dbValue + value
1 * mockDao.updateCounter(namespace, date, key, min, shardID, dbValue + value)

在这种情况下,将返回“0”而不是“dbValue”。但是,如果我注释掉这两个检查中的任何一个,则它会通过。因此,以下两种情况通过了:
//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'

最佳答案

这是预期的行为并已记录在案。如果您想在同一个模拟中进行模拟和 stub ,则必须在一行中完成,例如

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

这是 relevant section:

模拟和 stub 相结合

模拟和 stub 相辅相成:
1 * subscriber.receive("message1") >> "ok"
1 * subscriber.receive("message2") >> "fail"

当模拟和 stub 相同的方法调用时,它们必须在相同的交互中发生。特别是,以下将Mockito样式的 stub 和模拟拆分为两个单独的语句将不起作用:
setup:
subscriber.receive("message1") >> "ok"

when:
publisher.send("message1")

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

Where to Declare Interactions中所述, receive调用将首先与 then:块中的交互进行匹配。由于该交互未指定响应,因此将返回该方法的返回类型的默认值(在这种情况下为 null)。 (这只是Spock宽大的 mock 方法的另一个方面。)因此, setup:块中的交互将永远不会有匹配的机会。

注意 |同一方法调用的模拟和 stub 必须在同一交互中发生。

关于unit-testing - Spock模拟返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41841668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com