Клеевой код не загружается при работе с огуречной пружиной из jar-файла - PullRequest
0 голосов
/ 13 февраля 2019

Я пытался запустить весенние тесты на огурец, используя комбинацию Junit (4.12), Cucumber-Java (4.1.1), Cucumber-Spring (4.1.1) и Cucumber-Junit (4.1.1).).У меня нет проблем с загрузкой связующего кода при запуске тестов из среды IDE (IntelliJ 2018.3.4), но кажется, что по какой-то причине, когда я пытаюсь запустить из скомпилированного jar-файла (что в данном случае является обязательным требованием), cucumber не 'найти определения шагов.

Я уже пробовал несколько форматов кода клея, таких как: "classpath: com.abcstepdefs" "com.abcstepdefs" "classpath: com / a / b / c / stepdefs"

Iтакже пытался предоставить относительные пути от класса бегуна до класса определений шагов (вложенный всего на один уровень ниже) "stepdefs"

Также попытался запустить с использованием как JUnit, так и cucumber.cli.Main и попыталсяиспользовать разные стили определений шагов (оба выражения огурца - на которые указывают мне пропущенные фрагменты шагов - и регулярное выражение)

Я использую плагин spring-boot-maven-plugin, поэтому я знаю, что это в целом меняетсяструктура jar

Все вышеперечисленные варианты полностью работают при запуске из IDE, но не из файла jar

Основной класс:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan(basePackages = {"com.a.b.test.core.data",
    "com.a.b.c",
    "com.a.b.c.stepdefs"}
)
public class CucumberApplication {

    public static void main(String[] args) throws IOException, InterruptedException {

        SpringApplication.run(CucumberApplication.class, args);

        Result result = JUnitCore.runClasses(RunnerCentral.class);
        System.exit(result.wasSuccessful() ? 0 : 1);

    }
}

Класс бегуна:

package com.a.b.c;

@RunWith(Cucumber.class)
@CucumberOptions(features = "classpath:BOOT-INF/classes/features",
glue = "classpath:com/a/b/c/stepdefs",
plugin = "json:target/cucumber-html-reports/cucumber.json")
public class RunnerCentral {
}

Конфигурация POM для spring-boot-maven-plugin:

  <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>2.1.0.RELEASE</version>
         <configuration>
             <fork>true</fork>
             <mainClass>${start-class}</mainClass>
             <requiresUnpack>
                 <dependency>
                     <groupId>io.cucumber</groupId>
                     <artifactId>cucumber-java</artifactId>
                 </dependency>
                 <dependency>
                     <groupId>io.cucumber</groupId>
                     <artifactId>cucumber-spring</artifactId>
                 </dependency>
                 <dependency>
                     <groupId>io.cucumber</groupId>
                     <artifactId>cucumber-junit</artifactId>
                 </dependency>
             </requiresUnpack>
         </configuration>
         <executions>
             <execution>
                 <goals>
                     <goal>repackage</goal>
                 </goals>
             </execution>
         </executions>
     </plugin> 

Я ожидаю, что поведение будет совместимым между запуском из IDE и запуском из упакованного источника, хотя я могу бытьМиссЧто-то

Еще одна вещь, которую я хочу упомянуть, это то, что при замене бэкенда на cucumber-picocontainer все работает (пружина является обязательным условием, поэтому обмен невозможен)

1 Ответ

0 голосов
/ 19 февраля 2019

Это проблема, из-за которой вы можете выпить горячий кофе у ближайшего коллеги.

Вы видели этот пост об использовании собственного ResourceLoader https://github.com/cucumber/cucumber-jvm/issues/1320

Я думаю, вам нужно скопировать и вставить класс Cucumber.java, предоставляя загрузчик ресурсов во время выполнения изКонтекст приложения и измените класс RunnerCentral на RunWith новый класс.

FWIW. В моем случае я поместил необработанный проект в контейнер Docker, который при запуске выполнялся ./mvnw test, который является Maven Wrapper, поставляемым в Spring.Загрузочные проекты.Вы можете сделать ./mvnw test -s /path/to/maven/settings.xml, если используете корпоративный репозиторий, и если ваш контейнерный хост не может получить доступ к корпоративному репозиторию, сначала запустите образ в окне Jenkins (или там, где он создается), что приведет к тому, что jar-файлы зависимостей будутзагрузите внутрь, затем зафиксируйте образ докера и вытолкните его наружу.

Таким образом, контейнер может запустить фазу теста на огурец, используя локальный каталог .m2 внутри него с уже существующими зависимостями.

...