从 Spring Boot 应用程序启动的 Cucumber 在 jar 中找不到胶水类

Lav*_*nia 5 cucumber gradle gherkin cucumber-jvm spring-boot

我们有一个 Spring Boot 应用程序,我们想从这个应用程序中开始执行 Cucumber 功能。每当用户单击 spring 应用程序中的按钮时,调用就会进入一个类 ( CucumberTestService),我们开始执行 Cucumber 功能。

以下是我们感兴趣的源代码结构:

    - src
        -main
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
                                        -SendMessagesDefs.java
                                    -CucumberTestService.java
Run Code Online (Sandbox Code Playgroud)

我们准备参数CucumberTestService

   String[] args = new String[]{
                "--strict",
                "--glue",
                "com.bino.panel.server.reference.cucumber.steps",
                "--plugin",
                "pretty",
                "/CUCUMBER-FEATS/" + feature + ".feature",
                "--plugin",
                "json:" + reports_path + "/cucumber-reports-" + feature + "/Cucumber.json",
                "--plugin",
                "junit:" + reports_path + "/cucumber-reports-" + feature + "/Cucumber.xml",
                "--plugin",
                "html:" + reports_path + "/cucumber-reports-" + feature,
                "--plugin",
                "usage:" + reports_path + "/cucumber-reports-" + feature + "/cucumber-usage.json",
                "--plugin",
                "pretty:" + reports_path + "/cucumber-reports-" + feature + "/cucumber-pretty.txt"
        };
Run Code Online (Sandbox Code Playgroud)

然后我们尝试通过以下方式启动它 - 与它在 中启动时完全一样cucumber.api.cli.Main

    run(args, Thread.currentThread().getContextClassLoader());
Run Code Online (Sandbox Code Playgroud)

现在这在我们的 IDE(Eclipse 和 IntelliJ)中工作得很好,但是当我们将它打包到一个 Spring Boot jar 中时,它就停止工作了。

对于部署,整个应用程序捆绑在一个 jar 中,并具有以下结构:

    - BOOT-INF
        -classes
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
        -lib
    - META-INF
        MANIFEST.ML
    - org
        -springframework
            -boot
                -loader
Run Code Online (Sandbox Code Playgroud)

在尝试执行它时,Cucumber 似乎无法找到在glue 参数中定义的实现:

1 Scenarios (1 undefined) 7 Steps (7 undefined) 0m0.000s

我们花了相当多的时间来调查这个问题,并得出结论,"com.bino.panel.server.reference.cucumber.steps"当从 Spring Boot jar 执行它时,Cucumber 无法从这个路径找到类。但是当从 IDE(Eclipse、IntelliJ)执行相同的代码时,它们会被正确找到。

关于我们如何“帮助” Cucumber & Spring 在 Spring Boot jar 中找到胶水类的任何建议?

使用的 Jar 版本(取自我们的build.gradle文件):

    - compile group: 'io.cucumber', name: 'gherkin', version: '6.0.14'
    - compile(group: 'info.cukes', name: 'cucumber-java8', version: '1.2.5')
    - compile(group: 'io.cucumber', name: 'cucumber-junit', version: '4.2.6')
    - compile(group: 'io.cucumber', name: 'cucumber-picocontainer', version: '2.4.0')
Run Code Online (Sandbox Code Playgroud)

Spring Boot 版本是 2.1.3

任何帮助/建议/想法都非常感谢!非常感谢!

Noe*_*Yap 0

使用 Gradle,将 Cucumber 工件(即功能、步骤实现等)放入子项目中,例如my-cucumber-tests与 Spring Boot 应用程序分开。

然后在 Spring Boot 应用程序的 build.gradle 中添加:

bootJar {
  // make backend, features, and steps available to Cucumber at runtime
  requiresUnpack '**/my-cucumber-tests-*.jar', '**/cucumber-java-*.jar'
}
Run Code Online (Sandbox Code Playgroud)