根据get/setProperty的文档,我想在Spock测试中重写getProperty()
方法。在普通的Groovy类中,这是微不足道的,但在Spock规范中似乎不起作用。
class MainSpec extends Specification {
@Override
def getProperty(String name) {
def value = metaClass.getProperty(this, name)
println "$name == $value"
return value
}
String foo = 'foo'
def test() {
expect:
foo
println foo
}
}
此示例未调用getProperty()
方法。 Spock似乎以某种方式绕过了它。有没有办法钩住Spock的属性解析机制,或告诉Spock使用我的重写方法?
答案 0 :(得分:1)
是的,您可以使用“ Expando”样式,该属性不应在Spec类上定义,而应存储在地图(storage
)中并由setProperty
和{{1}操纵}方法:
getProperty
注释后更新:当您不初始化class MetaprogrammingSpec extends Specification {
def storage = [:]
@Override
def getProperty(String name) {
def value = storage[name]
println "$name == $value"
return value
}
@Override
void setProperty(String name, value) {
storage[name] = value
}
def test() {
when:
foo = 'bar'
then:
foo
println foo
}
}
属性时,也会调用getProperty()
方法。当您以这种方式更改测试时:
foo
结果与预期的一样-调用了def test() {
expect:
foo
println foo
}
,但是测试失败,因为getProperty()
是foo
:
答案 1 :(得分:0)
事实证明,即使父级是另一个getProperty()
类,将属性移到父类也足以使其通过Specification
拦截器。
class BaseSpec extends Specification {
def foo = 'foo'
}
class MainSpec extends BaseSpec {
@Override
def getProperty(String name) {
def value = super.getProperty(name)
println "$name == $value"
return value
}
def test() {
expect:
foo
println foo
}
}