使用spock数据表填充对象

Ehm*_*Kah 4 java groovy spock

我是第一次使用Spock.由于我们使用的是复杂的域模型,因此可以使用一种机制,这种机制允许我根据spock表给出的数据创建完整的对象.我不想每次都给出所有值,我只想设置datable中定义的值.所以应该在某处定义默认值.

是的,我知道我可以自己写,但也许有一个开箱即用的解决方案.

class A {
   String name
   int age
}
Run Code Online (Sandbox Code Playgroud)

spock表

id | givenA                     | ...
1  | [name: "Michael"]          | ...
2  | [name: "Thomas", age: 45 ] | ...
Run Code Online (Sandbox Code Playgroud)
  1. => A.name ="Michael",A.age =在某处定义默认值
  2. => A.name ="Thomas"A.age = 45(因为我覆盖了默认值)

th3*_*org 12

在我拥有的每个项目中,我创建了我称之为'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
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以与您已经完成相同的方式创建地图,在您的课程中使用此方法.

    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]
    }
Run Code Online (Sandbox Code Playgroud)

它不是内置的Spock功能,但它应该很好地为您指定的用例提供.