类成员如何从GebSpec基类中获得价值

时间:2018-10-06 03:07:01

标签: spock geb

我目前正在尝试为我的Geb-Spock框架创建一个GlobalExtension。到目前为止,这是我的扩展名:

class OnFailureListener extends AbstractRunListener {

    private final String id

    private final SauceREST sauceREST

    public OnFailureListener(String id, String username, String accessKey) {
        this.id = id
        this.sauceREST = new SauceREST(username, accessKey)
    }

    def void error(ErrorInfo error) {
        println error;
        this.sauceREST.updateJobInfo(this.sessionIdProvider.getSessionId(), "failed")
     }
}

class ResultExtension extends AbstractGlobalExtension {

    protected final String username = System.getenv("SAUCE_USERNAME")
    protected final String accesskey = System.getenv("SAUCE_ACCESS_KEY")
    protected final String sessionId

    @Override
    void visitSpec(SpecInfo specInfo) {
        specInfo.addListener(new OnFailureListener(sessionId, username, accesskey))
        }
 }

我的问题是sesssionId的值在我用于其他规范的GebSpec基类中分配,而不能直接在扩展类中分配。除了使用一些粗糙的反射方法之外,还有没有办法访问扩展中基类中分配的sessionId值?我也想避免使用AnnotationExtension,因为我想在不修改任何规范代码的情况下全局应用它(类似于JUnit TestWatcher模式)。

1 个答案:

答案 0 :(得分:1)

最简单的方法是将sessionId写到共享的ThreadLocal中,监听者和规范可以访问此共享,否则必须实现org.spockframework.runtime.extension.IMethodInterceptor这样您就可以访问实际的测试实例以提取字段值。