Да, вы можете использовать стиль «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
}
}
Тогда результат:
Обновление после комментария: Метод getProperty()
также вызывается, когда вы не инициализируетеfoo
свойство.Когда вы меняете тест таким образом:
def test() {
expect:
foo
println foo
}
Результат, как и ожидалось - getProperty()
вызван, но тест не пройден, потому что foo
равен null
: