我目前正在尝试为我的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
模式)。
答案 0 :(得分:1)
最简单的方法是将sessionId
写到共享的ThreadLocal
中,监听者和规范可以访问此共享,否则必须实现org.spockframework.runtime.extension.IMethodInterceptor
这样您就可以访问实际的测试实例以提取字段值。