spock是否有任何Test事件监听器,如TestNg具有ITestListener
的方式。 ?
当测试用例失败时,我可以访问
答案 0 :(得分:6)
Spock确实有听众。不幸的是,官方文档,其他非常好,有" TODO"在编写自定义扩展下:http://spockframework.github.io/spock/docs/1.0/extensions.html。
更新:官方文档已更新,其中包含有关自定义扩展程序的有用信息: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(ErrorListenerExtension)
@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
答案 1 :(得分:0)
Spock通过Mock进行互动:
def "should send messages to all subscribers"() {
given:
def subscriber = Mock(Subscriber)
when:
publisher.send("hello")
then:
1 * subscriber.receive("hello")
}
请参阅文档中的interaction based testing