spock是否具有任何Test事件监听器,例如TestNg具有ITestListener的方式。 ?

这样,当测试用例失败时,我就可以访问。

最佳答案

Spock确实有听众。不幸的是,本来很好的官方文档却在“编写自定义扩展名:http://spockframework.github.io/spock/docs/1.0/extensions.html”下有“TODO”字样。
更新:官方文档已更新,以包含有关自定义扩展名http://spockframework.org/spock/docs/1.1/extensions.html的有用信息。请参阅那些以获取更多详细信息。
有两种方法:基于注释的全局
基于注释的
这里有三部分:注释,扩展和监听器。
批注:

    import java.lang.annotation.*
    import org.spockframework.runtime.extension.ExtensionAnnotation

    @Retention(RetentionPolicy.RUNTIME)
    @Target([ElementType.TYPE, ElementType.METHOD])
    @ExtensionAnnotation(ListenForErrorsExtension)
    @interface ListenForErrors {}
扩展名(已更新):
    import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension
    import org.spockframework.runtime.model.SpecInfo

    class ListenForErrorsExtension extends AbstractAnnotationDrivenExtension<ListenForErrors> {
        void visitSpec(SpecInfo spec) {
            spec.addListener(new ListenForErrorsListener())
        }

       @Override
       void visitSpecAnnotation(ListenForErrors annotation, SpecInfo spec){
        println "do whatever you need here if you do. This method will throw an error unless you override it"
    }
    }
听众:
    import org.spockframework.runtime.AbstractRunListener
    import org.spockframework.runtime.model.ErrorInfo

    class ListenForErrorsListener extends AbstractRunListener {
        void error(ErrorInfo error) {
            println "Test failed: ${error.method.name}"
            // Do other handling here
        }
    }
然后,您可以在Spec类或方法上使用新的注释:
    @ListenForErrors
    class MySpec extends Specification {
        ...
    }
全局
这也包括三部分:扩展名,监听器和注册。
    class ListenForErrorsExtension implements IGlobalExtension {
        void visitSpec(SpecInfo specInfo) {
            specInfo.addListener(new ListenForErrorsListener())
        }
    }
您可以使用与上述相同的ListenForErrorsListener类。
要注册扩展名,请在org.spockframework.runtime.extension.IGlobalExtension目录中创建一个名为META-INF/services的文件。如果使用Gradle/Maven,它将在src/test/resources下。该文件应仅包含全局扩展的完全限定的类名,例如:
com.example.tests.ListenForErrorsExtension
引用
有关示例,请参见此处的Spock内置扩展:
https://github.com/spockframework/spock/tree/groovy-1.8/spock-core/src/main/java/spock/lang
https://github.com/spockframework/spock/tree/groovy-1.8/spock-core/src/main/java/org/spockframework/runtime/extension/builtin

10-07 18:54