spring - 有没有办法在另一个项目中重用来自多个项目的 cucumber 步骤?

标签 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)
    }

}
服务乙
@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 中,我想一起测试这两个服务。为此,我创建了一个 jar 文件,其中包含每个服务的步骤定义,并将它们作为依赖项拉入项目 C。
当我尝试使用服务 A 和服务 B 中的步骤从项目 C 运行 cucumber 测试时,我看到两个项目中都使用 Spring Context 的问题,我猜这是正确的。
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
有没有办法连接这两个服务,以便我可以为这两个服务配置 Bean 并重用这些步骤?

最佳答案

使用 cucumber-spring 时 cucumber 用Spring的TestContextManager框架。该框架使用单个类启动测试上下文。检查此类是否有任何配置应用程序上下文的注释,例如 @ContextConfiguration .
由于两个步骤定义都有这个注释 Cucumber 不能决定使用哪个,你会得到提示这个的错误。要解决这个问题,您应该确保只有一个胶水类具有 @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

关于spring - 有没有办法在另一个项目中重用来自多个项目的 cucumber 步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63466324/

相关文章:

android - 使用 Android Gradle Plugin v. 3.5.2 构建 Android 项目时,我的构建失败

Spring 4 无法执行 Java 8 默认方法

java - 使用 JDBC 滚动策略对表格数据进行分页是否会导致性能下降?

android - 如何解析 Kotlin 中 Room 库的注解?

cucumber - cucumber 中 "scenario"相对于 "scenario outline"有什么好处?

ruby - 我如何最好地在 Cucumber 中表达这种依赖于时间的场景?

go - 在GoDog测试框架中使用断言库

java - 停止 Tomcat 不会删除 Derby db.lck

java - Spring拦截器与servlet过滤器

java - Kotlin 中的 setter/getter 和属性之间的歧义,最佳实践?