В итоге мы сделали следующее. Сначала мы определили класс, реализующий интерфейс 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 {
}
Теперь, когда мы аннотируем класс Spe c с помощью аннотации MockConfigMap, метод visitSpecAnnotation вызывается, и мы получаем желаемое поведение.