Cucumber Spring DI Двухступенчатые классы загрузки Spring контекста - PullRequest
1 голос
/ 01 октября 2019

Я использую cucumber-spring для создания интеграционных тестов и использую DI, предоставленный Spring. Как это делается: есть отдельный проект, который определяет все необходимые зависимости от огурцов:

<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();
    }

Итак, проблема, с которой я работаю: - если мой RunTestIT не аннотирован SpringBootTest или ContextConfiguration - 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 из внешнего проекта (поэтому мне не нужно копировать / вставлять оттуда и получать последнюю функциюобновлений), но мне также нужно, чтобы зависимости из моего весеннего контекста были автоматически подключены.

Я прочитал статью https://thepracticaldeveloper.com/2018/03/31/cucumber-tests-spring-boot-dependency-injection/ Но она касается только нескольких определений шагов внутри одного проекта.

У вас есть идеи, как я могу решить проблему?

...