从jar文件在黄瓜弹簧后端运行时未加载胶水代码

时间:2019-02-13 13:36:17

标签: spring maven spring-boot cucumber-java cucumber-junit

我一直在尝试使用Junit(4.12),Cucumber-Java(4.1.1),Cucumber-Spring(4.1.1)和Cucumber-Junit(4.1.1)的组合来运行基于春季的黄瓜测试)。 从IDE内部运行测试(IntelliJ 2018.3.4)时加载胶水代码没有问题,但是由于某种原因,当我尝试从已编译的jar文件运行时(在这种情况下是必需的),黄瓜似乎并没有这样做。找不到步骤定义。

我已经尝试了多种粘合代码格式,例如:     “ classpath:com.a.b.c.stepdefs”     “ com.a.b.c.stepdefs”     “ classpath:com / a / b / c / stepdefs”

我还尝试提供从跑步者类到步骤定义类的相对路径(仅嵌套在下面的一级) “ 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 {
}

spring-boot-maven-plugin的POM配置:

  <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运行与从打包源运行之间的行为是一致的,尽管我可能会遗漏一些东西

我想提到的另一件事是,当用黄瓜picocontainer交换后端时,一切似乎都可以正常工作(需要弹簧,所以不能进行交换)

1 个答案:

答案 0 :(得分:0)

这种问题可能会让您在最近的同事处推出热咖啡。

您是否看过有关使用自定义ResourceLoader https://github.com/cucumber/cucumber-jvm/issues/1320

的帖子

我认为您必须复制并粘贴Cucumber.java类,从Application Context向运行时提供资源加载器,并将RunnerCentral类更改为RunWith新类。

在我的情况下,FWIW将原始项目放置在一个docker容器中,该容器在启动时运行./mvnw test,这是Spring Boot项目中提供的Maven Wrapper。如果使用公司存储库,则可以执行./mvnw test -s /path/to/maven/settings.xml,并且如果容器主机无法访问公司存储库,请首先在Jenkins框(或构建映像的任何位置)上运行映像,这将导致依赖关系jar将其下载到内部,然后提交docker映像,然后将该映像推出。

通过这种方式,容器可以使用其中的本地.m2目录运行黄瓜测试阶段,并且已经有了所需的依赖项。