当前位置: 首页 > 知识库问答 >
问题:

Spock元编程getProperty()

包子航
2023-03-14

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

共有1个答案

梁季
2023-03-14

是的,您可以使用“expando”样式,其中属性不应在Spec类上定义,而是存储在映射(存储)中,并由setpropertygetproperty方法操作:

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

注释后更新:不初始化foo属性时,也会调用getProperty()方法。当您以这种方式更改测试时:

def test() {
    expect:
    foo
    println foo
}
 类似资料:
  • 技术的学习是一个登山的过程。第一章是最为平坦的山脚道路。而从这一章开始,则是正式的爬坡。无论是我写作还是你阅读,都需要付出比第一章更多的代价。那么问题就是,付出更多的精力学习模板是否值得? 这个问题很功利,但是一针见血。因为技术的根本目的在于解决需求。那C++的模板能做什么? 一个高(树)大(新)上(风)的回答是,C++里面的模板,犹如C中的宏、C#和Java中的自省(restropection)

  • 元编程 避免无谓的元编程。 当编写程序库时,不要使核心类混乱(不要使用 monkey patch)。 对于 class_eval 方法,倾向使用区块形式,而不是字符串插值形式。 当使用字符串插值形式时,总是提供 __FILE__ 及 __LINE__,以使你的调用栈看起来具有意义: class_eval 'def use_relative_model_naming?; true; end', __

  • Metaprogramming is a programming technique in which computer programs have the ability to treat other programs as their data. It means that a program can be designed to read, generate, analyze or tran

  • javascript元编程? 问题来自于codewars The builder of things 要求我们实现一个Thing类,其中一点要求如下所示: 难点是这里的name的值从哪里找啊? 我想到的一个方案是使用with,但是codewars上使用的是严格模式,不能使用with。

  • 问题1 此问题改编自Dave Thomas的屏播Episode 5: Nine Examples of Metaprogramming。 众所周知,RubyLearnin.org的Core Ruby课程已经开办8周了。每周我们都有一个满分10分的测验。8周结束后,学生可以知道他的分数百分比。例如,有一个学生,在过去的8周里,他的得分情况为:5、10、10、10、10、10、10、10。那么,他的得

  • Boost.Call_traits 这个库提供了传递参数给函数的最好方法的自动演绎,依据参数的类型。例如,当传递的是如int 和 double这样的内建类型,最高效的方式是传值。对于用户自定义类型,则传送const引用通常更好。Call_traits为你自动选择正确的参数类型。这个库还有助于声明参数为引用,而不用冒引用到引用的风险(在C++这是非法的)。Call_traits常用于要求以最高效方式