是否可以在 Spock 测试中使用全局设置方法?
Is it possible to have a global setup method in Spock test?
我是 Grails/Groovy 应用程序的开发人员,该应用程序使用 Spock 作为其单元测试框架。该项目有大约 1000 个单元测试,我基本上想在 运行 所有测试之前执行特定的模拟/操作。最好它应该只执行一次,或者在每次测试之前执行 - 或者在所有测试的某个大子集之前执行。我想有可能有一个所有测试都可以扩展的“全局”设置方法。这可能吗?
Preferably it should only be executed once, alternatively before each
test - or before some large subset of all the tests. I imagine that it
out to be possible to have a “global” setup method which all tests can
extend. Is this possible?
是的,这是可能的。如何最好地做到这一点的具体细节将具体取决于您想要完成什么,但全球扩展可能是候选者。有关详细信息,请参阅 http://spockframework.org/spock/docs/1.3/extensions.html 的 "Writing Custom Extensions" 部分。那里有很大的灵活性。我们在为 Micronaut 编写自定义扩展方面取得了巨大成功。
希望对您有所帮助。
我们最终做了以下事情。首先我们定义了一个 class 实现 IAnnotationDrivenExtension 接口:
class MockConfigMapExtension implements IAnnotationDrivenExtension<MockConfigMap> {
@Override
void visitSpecAnnotation(MockConfigMap annotation, SpecInfo spec) {
// WRITE THE RELEVANT STARTUP CODE HERE
}
@Override
void visitFeatureAnnotation(MockConfigMap annotation, FeatureInfo feature) {
}
@Override
void visitFixtureAnnotation(MockConfigMap annotation, MethodInfo fixtureMethod) {
}
@Override
void visitFieldAnnotation(MockConfigMap annotation, FieldInfo field) {
}
@Override
void visitSpec(SpecInfo spec) {
}
}
我们在哪里定义了这个简单的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE])
@ExtensionAnnotation(MockConfigMapExtension.class)
@interface MockConfigMap {
}
现在,每当我们使用 MockConfigMap 注释对规范 class 进行注释时,都会调用 visitSpecAnnotation 方法,并且我们会获得所需的行为。
我是 Grails/Groovy 应用程序的开发人员,该应用程序使用 Spock 作为其单元测试框架。该项目有大约 1000 个单元测试,我基本上想在 运行 所有测试之前执行特定的模拟/操作。最好它应该只执行一次,或者在每次测试之前执行 - 或者在所有测试的某个大子集之前执行。我想有可能有一个所有测试都可以扩展的“全局”设置方法。这可能吗?
Preferably it should only be executed once, alternatively before each test - or before some large subset of all the tests. I imagine that it out to be possible to have a “global” setup method which all tests can extend. Is this possible?
是的,这是可能的。如何最好地做到这一点的具体细节将具体取决于您想要完成什么,但全球扩展可能是候选者。有关详细信息,请参阅 http://spockframework.org/spock/docs/1.3/extensions.html 的 "Writing Custom Extensions" 部分。那里有很大的灵活性。我们在为 Micronaut 编写自定义扩展方面取得了巨大成功。
希望对您有所帮助。
我们最终做了以下事情。首先我们定义了一个 class 实现 IAnnotationDrivenExtension 接口:
class MockConfigMapExtension implements IAnnotationDrivenExtension<MockConfigMap> {
@Override
void visitSpecAnnotation(MockConfigMap annotation, SpecInfo spec) {
// WRITE THE RELEVANT STARTUP CODE HERE
}
@Override
void visitFeatureAnnotation(MockConfigMap annotation, FeatureInfo feature) {
}
@Override
void visitFixtureAnnotation(MockConfigMap annotation, MethodInfo fixtureMethod) {
}
@Override
void visitFieldAnnotation(MockConfigMap annotation, FieldInfo field) {
}
@Override
void visitSpec(SpecInfo spec) {
}
}
我们在哪里定义了这个简单的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE])
@ExtensionAnnotation(MockConfigMapExtension.class)
@interface MockConfigMap {
}
现在,每当我们使用 MockConfigMap 注释对规范 class 进行注释时,都会调用 visitSpecAnnotation 方法,并且我们会获得所需的行为。