Проблема в вашей переменной @Shared
.В руководстве Geb говорится:
(...) объявляет поле @Shared.Опять же, лучше всего инициализировать поле прямо в точке объявления.(Семантически это эквивалентно инициализации поля в самом начале метода setupSpec()
.)
Дело в том, что setupSpec()
запускается до того, как GebConfig
будетоценены.Вы можете увидеть это, если добавите это в конец вашей GebConfig
:
println "Finished evaluating GebConfig"
Затем запустите эту спецификацию Geb (я обернул назначения переменных в замыкания и добавил операторы печати, затем я оцениваюзамыкания для выполнения заданий):
package de.scrum_master.stackoverflow
import geb.spock.GebReportingSpec
import spock.lang.Shared
class GebConfigIT extends GebReportingSpec {
@Shared
def sharedLang = {
println "Initialising sharedLang"
System.getProperty("geb.env.lang")
}()
def normalLang = {
println "Initialising normalLang"
System.getProperty("geb.env.lang")
}()
def setup() {
println "sharedLang = $sharedLang"
println "normalLang = $normalLang"
}
def foo() {
expect:
!sharedLang
normalLang
}
def bar() {
expect:
!sharedLang
normalLang
}
}
Initialising sharedLang
Finished evaluating GebConfig
Initialising normalLang
sharedLang = null
normalLang = nl
Initialising normalLang
Finished evaluating GebConfig
sharedLang = null
normalLang = nl
Можете ли вы увидеть, как sharedLang
инициализируется только один раз в самом начале, прежде чем GebConfig
даже получит шанс войти?
Итог: просто удалите @Shared
из своего кода.В любом случае, он часто используется большинством людей, они думают, что таким образом экономят время на дешевых ресурсах и вмешиваются в их чистые настройки приборов.@Shared
действительно только для очень дорогих ресурсов и очень исключительных случаев.