Можно ли использовать метод глобальной настройки в тесте Спока? - PullRequest
0 голосов
/ 30 января 2020

Я разработчик приложения Grails / Groovy, которое использует Spock в качестве основы для модульного тестирования. В проекте имеется около 1000 модульных тестов, и я бы по существу хотел выполнить конкретную c макет / операцию до запуска всех тестов. Предпочтительно его следует выполнять только один раз, альтернативно перед каждым тестом или перед некоторым большим подмножеством всех тестов. Я полагаю, что возможно иметь «глобальный» метод настройки, который могут расширяться всеми тестами. Это возможно?

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Предпочтительно, его следует выполнять только один раз, альтернативно перед каждым тестом или перед некоторым большим подмножеством всех тестов. Я полагаю, что возможно иметь «глобальный» метод настройки, который могут расширяться всеми тестами. Возможно ли это?

Да, это возможно. Специфика того, как лучше всего это сделать, будет зависеть от того, чего вы хотите достичь sh, но глобальные расширения являются вероятными кандидатами. См. Подробности в разделе «Написание пользовательских расширений» в http://spockframework.org/spock/docs/1.3/extensions.html. Там много гибкости. У нас был большой успех в написании пользовательских расширений для Micronaut.

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2020

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

...