Спок Метапрограммирование getProperty () - PullRequest
1 голос
/ 14 мая 2019

Я бы хотел переопределить метод getProperty() в тесте Спока согласно документации get / setProperty . Это тривиально в обычном классе Groovy, но, похоже, не работает внутри спецификации Спока.

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(). Похоже, Спок как-то обходит это. Есть ли способ подключиться к механизму разрешения свойств Спока или сказать Споку использовать мой переопределенный метод?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Да, вы можете использовать стиль «Expando», когда свойство не должно быть определено в классе Spec, но хранится на карте (storage) и управляется с помощью методов setProperty и 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
    }
}

Тогда результат: enter image description here

Обновление после комментария: Метод getProperty() также вызывается, когда вы не инициализируетеfoo свойство.Когда вы меняете тест таким образом:

def test() {
    expect:
    foo
    println foo
}

Результат, как и ожидалось - getProperty() вызван, но тест не пройден, потому что foo равен null: enter image description here

0 голосов
/ 16 мая 2019

Оказывается, что перемещение свойства в родительский класс достаточно, чтобы оно прошло через перехватчик 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
    }
}
...