使用spock数据表来填充对象 [英] Using spock data table for filling objects

查看:279
本文介绍了使用spock数据表来填充对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

示例

  class A {
字符串名称
int age
}

spock表格

  id | givenA | ... 
1 | [名称:迈克尔] | ...
2 | [名称:托马斯,年龄:45] | ...




  1. => A.name =Michael,A .age = defined default somewhere

  2. => A.name =ThomasA.age = 45(因为我覆盖了默认值)


解决方案

在每个项目中,我创建了我称之为UnitTestUtils的类,并且该类大多包含帮助程序方法,该方法使用默认值创建域对象,允许重写这些值。例如:

  Person createTestPerson(Map overrides = [:]){
Person p = new Person(name: Jim Bob,年龄:45)
overrides.each {String key,value - >
if(p.hasProperty(key)){
p.setProperty(key,value)
} else {
println错误:尝试添加不存在的属性
}
}
返回p
}

然后你可以通过创建一个和你已经完成的相同的方法在你的课堂上使用这个方法。

  voidmy test(){
given:
Person person
when:
person = UnitTestUtils.createTestPerson(givenA)
then:
person.name == expected.name
person.age == expected.age
其中:
id | givenA |预计
1 | [名称:乔] | [名称:乔,年龄:45]
2 | [年龄:5] | [名称:Jim Bob,年龄:5]
}

在Spock特性中,但它应该很好地为您指定的用例提供。


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 ] | ...

  1. => A.name = "Michael", A.age = defined default somewhere
  2. => A.name = "Thomas" A.age = 45 (because I overwrite default value)

解决方案

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.

这篇关于使用spock数据表来填充对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆