Geb Spock无法读取GebConfig.groovy设置的系统变量,求助解决方案
问题分析
你的问题核心在于**@Shared变量的初始化时机早于GebConfig.groovy的执行时机**。当Spock初始化你的TC001_SMO_Scenario_Spec类时,被@Shared修饰的lang变量会立刻执行System.getProperty("geb.env.lang"),但此时Geb框架还未加载并执行GebConfig中的代码——那些System.setProperty的逻辑要等到Geb启动后才会运行,所以自然返回null。
解决方案1:在测试方法/初始化阶段获取变量
把变量的获取逻辑从@Shared移到测试方法内部,或者放到setup()方法(每个测试方法执行前运行)中。此时GebConfig已经执行完毕,系统变量已经被正确设置:
@Stepwise class TC001_SMO_Scenario_Spec extends GebReportingSpec { def lang // 移除@Shared修饰 def setup() { // 测试执行前获取变量,此时GebConfig已完成初始化 lang = System.getProperty("geb.env.lang") } def "Step 1: Perform Login"() { when: "Load File" to WUPage then: "File loaded successfully" println "Getting data from Geb Config File: " + lang } }
解决方案2:直接引用GebConfig中的配置变量
如果你希望在Spec中直接访问GebConfig的配置,可以把GebConfig里的envLang改为全局可访问的变量:
修改GebConfig.groovy:
def final DEFAULT_BROWSER = "chrome" def final DEFAULT_LANGUAGE = "nl" //"en" or "nl" // 改为全局可访问的变量(去掉局部def限制) envLang = System.getProperty("geb.env.lang") if (!correctLanguage(envLang)) { envLang = DEFAULT_LANGUAGE } browser = System.getProperty("geb.env") if (!correctBrowser(browser)) { browser = DEFAULT_BROWSER } System.setProperty("geb.env.lang", envLang) System.setProperty("geb.env", browser) environments { driver = { getDriver(browser, envLang) } }
然后在Spec中直接引用:
@Stepwise class TC001_SMO_Scenario_Spec extends GebReportingSpec { def "Step 1: Perform Login"() { when: "Load File" to WUPage then: "File loaded successfully" // 通过geb.config访问GebConfig中的变量 def lang = geb.config.envLang println "Getting data from Geb Config File: " + lang } }
解决方案3:使用Geb内置的配置API
Geb本身提供了访问当前环境配置的API,你可以通过browser.config直接获取相关设置:
@Stepwise class TC001_SMO_Scenario_Spec extends GebReportingSpec { def "Step 1: Perform Login"() { when: "Load File" to WUPage then: "File loaded successfully" // 从browser的原始配置中获取语言变量 def lang = browser.config.rawConfig.envLang println "Getting data from Geb Config File: " + lang } }
小提示
尽量避免在@Shared或类初始化阶段获取Geb相关配置,因为此时Geb框架还未完成初始化。优先选择在测试方法内部、setup()或setupSpec()方法中获取配置变量。
内容的提问来源于stack exchange,提问作者Durgesh
相关产品推荐
相关产品推荐

