【发布时间】:2019-05-13 23:19:42
【问题描述】:
根据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 使用我重写的方法?
【问题讨论】:
-
请问这个用例是什么?
-
我有一个包含大量属性的集成规范,这些属性基本上代表了外部系统中的标识符。这些 ID 映射到的数据是不稳定的,但我可以提前验证所有属性,并通过拦截它们的
getProperty()调用来缩短更昂贵的测试。至少,对于包含错误数据的测试,这会给我一个一致的失败消息。 -
Spock 使用 AST 转换并编译规范,无需进一步研究,我猜测它不使用 groovy MOP 来处理本地定义的属性。为什么不使用可以使用普通元编程的属性持有者类,它还可以更好地分离您的逻辑。
标签: groovy metaprogramming spock