我是第一次使用 Spock。由于我们使用的是复杂的域模型,因此拥有一种机制会很方便,它允许我根据 spock 表给出的数据创建完整的对象。我不想每次都给出所有值,我只想设置数据表中定义的值。所以应该在某个地方定义默认值。
是的,我知道我可以自己写,但也许有一个开箱即用的解决方案。
Example
class A {
String name
int age
}
斯波克表
id | givenA | ...
1 | [name: "Michael"] | ...
2 | [name: "Thomas", age: 45 ] | ...
- => A.name = "Michael", A.age = 在某处定义默认值
- => A.name = "Thomas" A.age = 45 (因为我覆盖了默认值)
在我拥有的每个项目中,我都会创建所谓的“UnitTestUtils”,并且此类主要包含辅助方法,这些方法创建具有默认值的域对象并允许覆盖这些值。例如:
Person createTestPerson(Map overrides = [:]){
Person p = new Person(name: "Jim Bob", age: 45)
overrides.each { String key, value ->
if(p.hasProperty(key)){
p.setProperty(key, value)
} else {
println "Error: Trying to add property that doesn't exist"
}
}
return p
}
然后,您可以通过以与您已经完成的相同的方式创建地图来在您的类中使用此方法。
void "my test"(){
given:
Person person
when:
person = UnitTestUtils.createTestPerson(givenA)
then:
person.name == expected.name
person.age == expected.age
where:
id| givenA | expected
1 | [name: "Joe"] | [name: "Joe", age: 45]
2 | [age: 5] | [name: "Jim Bob", age: 5]
}
它不是 Spock 的内置功能,但它应该可以很好地满足您指定的用例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)