当前位置:  开发笔记 > 编程语言 > 正文

Spock mock返回错误的值

如何解决《Spockmock返回错误的值》经验,为你挑选了1个好方法。

我有一个奇怪的用例,当我在'then:'部分中没有检查模拟类的两个调用时,spock mock返回正确的值,但是当我在'then:中包含两个检查时它返回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)

在这种情况下,不是'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'

Vampire.. 11

这是预期和记录的行为.如果你想在同一个模拟器上模拟和存根,你必须在一行中完成它

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

这里的相关部分:

结合模拟和剔骨

模拟和剔除是相辅相成的:

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

如在声明交互的位置中所解释的,该receive调用将首先与then:块中的交互匹配.由于该交互未指定响应,因此将返回方法的返回类型(null在本例中)的默认值.(这只是Spock宽大的嘲弄方法的另一个方面.)因此,setup:块中的交互永远不会有机会匹配.

注意 | 同一方法调用的模拟和存根必须在同一个交互中进行.



1> Vampire..:

这是预期和记录的行为.如果你想在同一个模拟器上模拟和存根,你必须在一行中完成它

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

这里的相关部分:

结合模拟和剔骨

模拟和剔除是相辅相成的:

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

如在声明交互的位置中所解释的,该receive调用将首先与then:块中的交互匹配.由于该交互未指定响应,因此将返回方法的返回类型(null在本例中)的默认值.(这只是Spock宽大的嘲弄方法的另一个方面.)因此,setup:块中的交互永远不会有机会匹配.

注意 | 同一方法调用的模拟和存根必须在同一个交互中进行.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有