如何解决模拟在参数化测试Spock中不起作用
因此,我正在尝试学习Spock,并且正在努力创建测试。
private WeaponWriter writer;
@Shared
def emptyObject = Mock(Weapon)
@Shared
def weaponMocked = Mock(Weapon)
def: "should flatten object"(){
given:
emptyObject.content() >> ""
weaponMocked.content() >> "BF Sword"
List<Weapon> weaponList = Arrays.asList(weapon1,weapon2)
writer = new WeaponWriter(weaponList)
when:
def text = writer.writeWeapon()
then:
text == expectedText
where:
weapon1 | weapon2 | expectedText
emptyObject | emptyObject | "Headline"
weaponMocked| emptyObject | "Headline" + "BF Sword"
weaponMocked| weaponMocked | "Headline" + "BF Sword" + "BF Sword"
}
如您所见,我想使用将Weapon
的列表转换为一个字符串的方法来测试类。
我有三个测试用例,只有第一个能正常工作。
WeaponWriter#writeWeapon
只是遍历武器列表,并且每个武器都调用Weapon#content
,然后将它们组合成一个字符串。
由于某种原因,我从中看到weaponMocked.content() >> "BF Sword"
的嘲笑没有返回BF Sword,有人知道为什么吗?
当我不使用参数化测试时,一切正常。
解决方法
好的,我想我已经发现了:正如我所说,您使用@Shared
模拟而不是为每个功能方法的每次迭代创建新的模拟,可能是因为您想在{{1 }}块。然后,即使共享变量应直接在声明期间或通过where:
方法初始化,您仍要尝试从测试中为这些模拟方法存根。更糟糕的是,您正在尝试为每次迭代重新初始化存根方法,这绝对是一个坏主意。
让我们假设我们已经测试了这些类(我使用的是Groovy,也可以是类似的Java类):
setupSpec()
package de.scrum_master.stackoverflow.q64013999
class Weapon {
private String name
Weapon(String name) {
this.name = name
}
String content() {
name
}
}
所以现在您至少有两个选择:
1。直接在模拟创建过程中初始化存根:
package de.scrum_master.stackoverflow.q64013999
class WeaponWriter {
private List<Weapon> weaponList
WeaponWriter(List<Weapon> weaponList) {
this.weaponList = weaponList
}
String writeWeapon() {
"Headline" + weaponList*.content().join("")
}
}
2。在package de.scrum_master.stackoverflow.q64013999
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
class WeaponWriterTest extends Specification {
private WeaponWriter writer
@Shared
def emptyObject = Mock(Weapon) {
content() >> ""
}
@Shared
def weaponMocked = Mock(Weapon) {
content() >> "BF Sword"
}
@Unroll
def "flatten weapon list into '#expectedText'"() {
given:
writer = new WeaponWriter([weapon1,weapon2])
expect:
writer.writeWeapon() == expectedText
where:
weapon1 | weapon2 | expectedText
emptyObject | emptyObject | "Headline"
weaponMocked | emptyObject | "Headline" + "BF Sword"
weaponMocked | weaponMocked | "Headline" + "BF Sword" + "BF Sword"
}
}
中初始化存根:
setupSpec()
请下次自己提供MCVE。谢谢。这是我为工作做好的空投,问了一个适当的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。