#spring #kotlin #cucumber #cucumber-jvm
#spring #kotlin #cucumber #cucumber-jvm
Вопрос:
У меня есть 2 микросервиса, A и B, для которых в их собственных проектах определены тесты cucumber.
Сервис A
@ContextConfiguration(classes = [AppConfiguration::class])
class ServiceAStepDefs @Autowired constructor(private var serviceAProfile: ServiceAProfile) : En {
//stepdefs live here
}
class AppConfiguration {
@Bean
fun serviceAProfileMaker(): ServiceAEnvironmentProfile {
val oktaConfig = DefaultOAuth2Config.getToken()
return ProfileManager.getEnvProfile(token)
}
}
Сервис B
@ContextConfiguration(classes = [AppConfiguration::class])
class ServiceBStepDefs {
//stepdefs live here
}
@ComponentScan("com.hello.*")
class AppConfiguration {
@Bean
fun serviceBProfileMaker(): ServiceBEnvironmentProfile {
val token = DefaultOAuth2Config.getToken()
return ProfileManager.getEnvProfile(token)
}
}
В другом проекте, C, я хочу протестировать эти 2 сервиса вместе. Чтобы сделать это, я создал файл jar, содержащий определения шагов для каждой из служб, и перенес их в project C в качестве зависимостей.
Когда я пытаюсь запустить тесты cucumber из проекта C, используя шаги из сервисов A и B, я вижу проблему, из-за которой контекст Spring подбирается в обоих проектах, что, я полагаю, правильно.
10:17:59.936 [DEBUG] [TestEventLogger] io.cucumber.core.backend.CucumberBackendException: Glue class class com.hello.serviceA.stepdefs.ServiceASteps and class com.hello.stepdefs.ServiceBSteps both attempt to configure the spring context. Please ensure only one glue class configures the spring context
Есть ли у меня способ подключить эти 2 службы, чтобы я мог настроить компоненты для обоих и повторно использовать шаги?
Ответ №1:
При использовании cucumber-spring
Cucumber используется TestContextManager
фреймворк Spring. Эта платформа запускает тестовый контекст с использованием одного класса. Этот класс проверяется на наличие любых аннотаций, которые настраивают контекст приложения, таких как @ContextConfiguration
.
Поскольку оба определения шага имеют эту аннотацию, Cucumber не может решить, какой использовать, и вы получите сообщение об ошибке с жалобой на это. Чтобы решить эту проблему, вы должны убедиться, что только один класс glue имеет @ContextConfiguration
аннотацию.
Cucumber v5.6.0 добавил @CucumberContextConfiguration
, который немного упростил это выполнение.
Итак, вы можете захотеть структурировать свои проекты следующим образом:
a
|- config
| | AConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue="a.steps")`
|- steps
| | ASteps
b
|- config
| | BConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue="b.steps")`
|- steps
| | BSteps
c
|- config
| | CConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue={"a.steps", "b.steps"})`
Смотрите: https://github.com/cucumber/cucumber-jvm/tree/main/spring