是否有通过"with"-function进行对象构造的更长的替代方案

Leo*_*ngs 0 java groovy

我们仅将Groovy用于测试,这意味着我们所有的域类等仍然是普通的Java类.为了轻松创建测试数据,我们目前使用以下技术:

示例Java类


public class Domain {
    private String name;
    private int id;
    private Domain parent;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Domain getParent() {
        return parent;
    }

    public void setParent(Domain parent) {
        this.parent = parent;
    }
}
Run Code Online (Sandbox Code Playgroud)

Groovy中的对象构造示例


Domain test = new Domain().with {
    name = "Test Object"
    id = 42

    delegate
}
Run Code Online (Sandbox Code Playgroud)

嵌套施工


Domain test = new Domain().with {
    name = "Test Object"
    id = 42
    parent = new Domain().with {
        name = "Parent"
        id = 47

        delegate
    }

    delegate
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Domain创建了对象,然后通过withGroovy 的功能进行配置.这里丑陋的事情是delegate最后再次返回实际对象.如果我们不在这里使用它,结果将是42而不是配置的对象.

是否有Groovier方法使用标准的Groovy函数来完成此操作,因此没有类别,mixins或自定义帮助函数.


编辑:添加嵌套对象构造示例.

编辑2:两个答案工作都有效:


import spock.lang.Specification


class StackOverflow extends Specification {

    def "Answer Ian Roberts" () {
        when:
        Domain test = new Domain(
                name: "Test object",
                id: 42,
                parent: new Domain(name: "Parent", id: 47))

        then:
        test.name == "Test object"
        test.id == 42
        test.parent.name == "Parent"
        test.parent.id == 47
    }

    def "Answer tim_yates"() {
        when:
        Domain test = [
            name: "Test object",
            id: 42,
            parent: [name:"Parent", id:47]
        ]

        then:
        test.name == "Test object"
        test.id == 42
        test.parent.name == "Parent"
        test.parent.id == 47
    }
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*rts 5

您可以将"命名参数"映射构造函数语法与任何Java类一起使用,前提是它具有无参数构造函数:

Domain test = new Domain(
    name:"Test object",
    id:42,
    parent:new Domain(name:"Parent", id:47))
Run Code Online (Sandbox Code Playgroud)

在幕后,Groovy将调用no-arg构造函数,后跟Java Bean属性setter,然后返回结果对象.