I am using Spock for the first time. Since we are using a complex domain-model it would be handy to have a mechanism, which allows me to create full objects from data given by spock tables. I do not want to give all values each time, I just want to set the values in defined in datable. So there should be defined default values somewhere.
Yes, I know I could write on my own, but maybe there is an out-of-the-box solution.
Example
class A {
String name
int age
}
spock table
id | givenA | ...
1 | [name: "Michael"] | ...
2 | [name: "Thomas", age: 45 ] | ...
In every project I have, I create what I call 'UnitTestUtils' and this class mostly contains helper methods that create domain objects with default values and allow for overrides of those values. For example:
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
}
Then you can make use of this method in your class by creating a map in the same way you've already done.
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]
}
It's not a built in Spock feature, but it should provide nicely for the use case you have specified.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With