我已经和这个问题斗争了两天了,但我想已经没有选择了。我不是 Cucumber 或 Gradle 方面的专家,但由于我的专业领域很接近(Java/Spring/Maven),所以我一直致力于将多个基于 Gradle 的 Cucumber 项目更新到所用框架的最新版本。我面临的问题之一是
io.cucumber.core.backend.CucumberBackendException: Please annotate a glue class with some context configuration.
我通过为每个项目添加一个这样的类来解决它,如下所示:
@CucumberContextConfiguration
@ContextConfiguration("classpath:cucumber.xml")
public class CucumberSpringConfiguration
{
}
这些配置已添加到步骤定义所在的相同包中,否则它是不可见的,因为步骤定义是通过测试运行器中的
glue
注释的 @CucumberOptions
属性指定的。
所以这一切都在这些项目中起作用,直到我开始将它们组合在一起作为依赖项。想象一下:项目 A 有一些步骤定义,并定义了其
CucumberSpringConfiguration
类。项目 B 有自己的步骤定义,并在与其步骤定义相同的包中定义了自己的 CucumberSpringConfiguration
类。现在,项目 C 导入 A 和 B 作为其依赖项,以利用步骤定义进行端到端测试。问题就出现在这里:
io.cucumber.core.backend.CucumberBackendException: Glue class class com.projectA.core.stepdef.CucumberSpringConfiguration and class com.projectB.core.stepdef.CucumberSpringConfiguration are both (meta-)annotated with @CucumberContextConfiguration.
Please ensure only one class configures the spring context
有什么方法可以解决这个问题?我想过像这样从类路径中排除那些(在 build.gradle 中),但没有成功:
tasks.withType(Test) {
excludes = ['**/CucumberSpringConfiguration**']
doFirst {
// Get the current classpath
def classpath = sourceSets.test.runtimeClasspath
// Filter out the specific class file I want to exclude
classpath = classpath.filter { file ->
!file.absolutePath.contains("CucumberSpringConfiguration")
}
// Set the modified classpath
setClasspath(files(classpath))
}
}
我尝试将依赖项项目中的 CucumberSpringConfiguration 移出该步骤定义包,但由于它在测试运行程序中的
glue
注释的 @CucumberOptions
参数中使用,因此它抱怨有必要拥有一个。
这里非常需要 Cucumber/Gradle 专家的帮助!提前非常感谢!
项目 A、B 和 C 各需要一个运行器类和一个在胶水路径上用
@CucumberContextConfiguration
注释的类。但他们不应该与其他项目共享这些课程。
因为您正在创建一个库,所以保存在
src/main
中的生产代码是共享的,但保存在 src/test
中的测试代码不是共享的。因此,粘合代码进入 src/main
,运行程序和带注释的类进入 src/test
。