Spock元编程getProperty()

时间:2019-05-13 23:19:43

标签: groovy metaprogramming spock

根据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使用我的重写方法?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用“ Expando”样式,该属性不应在Spec类上定义,而应存储在地图(storage)中并由setProperty和{{1}操纵}方法:

getProperty

那么结果是: enter image description here

注释后更新:当您不初始化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()fooenter image description here

答案 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
    }
}