首页 > 解决方案 > Cucumber Spring DI 两个 Step 类加载 Spring 上下文

问题描述

我正在使用 cucumber-spring 创建我的集成测试并使用 Spring 提供的 DI。完成方式:有一个单独的项目定义了所有必要的黄瓜依赖项:

<dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-java</artifactId>
           <version>${cucumber.version}</version>
       </dependency>
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-spring</artifactId>
           <version>${cucumber.version}</version>
       </dependency>
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-junit</artifactId>
           <version>${cucumber.version}</version>
       </dependency>

该项目还有一个带有 SpringBootTest 注释的基本测试类(允许加载应用程序上下文):

@RunWith(SpringRunner.class)
@SpringBootTest(
    classes = {SomeBeans.class}
)
public class BaseTestStateSteps {

我将此项目添加为我项目的 pom 中的依赖项:

<dependency>
   <groupId>com.externalproject</groupId>
   <artifactId>spring-test-cucumber</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>

然后我有我的跑步者课:

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "junit:target/cucumber/cucumber.xml", "json:target/cucumber/cucumber.json",
                "html:target/cucumber/html/"},
        tags = {"@Smoke"},
        features = {"src/test/resources/features"},
        glue = {"com.externalproject.steps","com.mycompany.steps"}
)
public class RunTestIT {
}

我也有我的 Step 课程:

public class MyTestSteps {

    @Autowired
    ClassToAutowire classToAutowire;

    @Given("^I can do something$")
    public void generateRandomPhoneNumber() {
        classToAutowirer.doSomething();
    }

所以我正在运行的问题: - 如果我没有用 SpringBootTest 或 ContextConfiguration 注释我的 RunTestIT - ClassToAutowire 为空(它不是自动装配的);- 如果我添加这些注释中的一个,我会遇到错误:

cucumber.runtime.CucumberException: Glue class class com.externalproject.steps.BaseTestStateSteps and class com.mycompany.steps.MyTestSteps both attempt to configure the spring context. Please ensure only one glue class configures the spring context

我需要来自外部项目的 Steps 功能(因此我不必从那里复制/粘贴并获取最新的功能更新),但我还需要自动装配来自我的 spring 上下文的依赖项。

我阅读了文章https://thepracticaldeveloper.com/2018/03/31/cucumber-tests-spring-boot-dependency-injection/ 但它只处理同一个项目中的多个步骤定义。

你有什么想法我可以解决这个问题吗?

标签: spring-bootintegration-testingcucumber-java

解决方案


推荐阅读