首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在jar文件中使用cucumber-spring后端运行时,不加载粘合代码

在jar文件中使用cucumber-spring后端运行时,不加载粘合代码
EN

Stack Overflow用户
提问于 2019-02-13 21:36:17
回答 1查看 1.1K关注 0票数 1

我一直在尝试使用Junit(4.12)、Cucumber-Java(4.1.1)、Cucumber-Spring(4.1.1)和Cucumber-Junit(4.1.1)的组合来运行基于Spring的黄瓜测试。当我从集成开发环境(IntelliJ 2018.3.4)内部运行测试时,加载胶水代码没有问题,但似乎由于某种原因,当我尝试从编译的jar文件(这是本例中的一个要求)运行时,cucumber找不到步骤定义。

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

我还尝试提供了从runner类到step定义类(嵌套在下面的一层) "stepdefs“的相对路径。

我还尝试了使用JUnit和cucumber.cli.Main运行,并尝试使用不同风格的步骤定义(黄瓜表达式和正则表达式)

我使用的是spring-boot-maven-plugin,所以我知道这通常会改变jar结构

当从IDE运行时,上述所有变体均可完全工作,但从jar文件运行时则不能完全工作

主类:

代码语言:javascript
复制
@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);

    }
}

Runner类:

代码语言:javascript
复制
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配置:

代码语言:javascript
复制
  <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交换后端时,一切似乎都正常(spring是必需的,所以交换是不可能的)。

EN

回答 1

Stack Overflow用户

发布于 2019-02-19 17:45:02

这是一种可以让你在最近的同事面前推出热咖啡的问题。

您看过这篇关于使用自定义ResourceLoader https://github.com/cucumber/cucumber-jvm/issues/1320的文章吗

我认为您必须复制并粘贴Cucumber.java类,从应用程序上下文向运行时提供资源加载器,并将RunnerCentral类更改为RunWith新类。

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

这样,容器就可以使用其内部的本地.m2目录运行黄瓜测试阶段,并且它所需的依赖项已经存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54671532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档