在 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
中测试
我正在为采用 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
中测试