在 Spock 中按名称设置成员变量

Setting member variables by name in Spock

我正在为采用 DTO 的函数编写 Spock 集成测试,该函数有很多成员变量。要测试的功能是允许一个用户角色更改一些成员变量,但如果该用户试图更改其他字段之一,它应该会失败。

我不想为每个字段手动编写测试,所以我想,我可以像这样使用 where: table:

where:
fieldname | value | isAccepted
"fieldA"  | "val" | true
"fieldB"  | "val" | false
...

为此,我必须能够通过字符串中的名称设置字段。在 Java 中,我必须为此使用反射。在 Python 中,我可以为此使用 setattr(object, fieldname, value)

自从我在 Groovy 中编写测试后,是否有一些惯用的东西?

是的,在 groovy 中有一种惯用的方法来动态访问字段和方法。您只需使用 GString 来引用该字段。

class A {
    String foo = 200
    String bar = 400
}

def a = new A()
def field = "foo"
println a."$field"
field = "bar"
println a."$field"
a."$field" = 600
println a.bar

产出

200
400
600

Groovy Web Console

中测试