Pepino lanzado desde la aplicación Spring Boot sin encontrar las clases de pegamento en el frasco

3 minutos de lectura

Tenemos una aplicación Spring Boot y queremos iniciar desde esta aplicación la ejecución de una característica de Cucumber. Cada vez que el usuario hace clic en un botón en la aplicación Spring, la llamada entra en una clase (CucumberTestService) donde comenzamos la ejecución de nuestra función Cucumber.

Aquí está la estructura del código fuente que es interesante para nosotros:

    - src
        -main
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
                                        -SendMessagesDefs.java
                                    -CucumberTestService.java

Preparamos los argumentos en 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"
        };

entonces estamos tratando de iniciarlo de la siguiente manera, exactamente como se inicia en cucumber.api.cli.Main:

    run(args, Thread.currentThread().getContextClassLoader());

Ahora, esto funciona bastante bien en nuestro IDE (Eclipse e IntelliJ), sin embargo, cuando empaquetamos esto en un contenedor de arranque de primavera, deja de funcionar.

Para la implementación, toda la aplicación se empaqueta en un contenedor y tiene la siguiente estructura:

    - BOOT-INF
        -classes
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
        -lib
    - META-INF
        MANIFEST.ML
    - org
        -springframework
            -boot
                -loader

Al intentar ejecutarlo, Cucumber no parece poder encontrar la implementación que se define en el parámetro de pegamento:

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

Pasamos bastante tiempo investigando este problema y llegamos a la conclusión de que Cucumber no puede encontrar las clases de esta ruta. "com.bino.panel.server.reference.cucumber.steps" al ejecutarlo desde un jar de Spring Boot. Pero se encuentran correctamente cuando se ejecuta el mismo código desde un IDE (Eclipse, IntelliJ).

¿Alguna sugerencia de cómo podemos “ayudar” a Cucumber & Spring a encontrar las clases de pegamento dentro de un tarro de arranque de primavera?

Jar Versiones utilizadas (tomadas de nuestro build.gradle archivo):

    - 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')

La versión Spring Boot es 2.1.3

¡Cualquier ayuda/sugerencia/idea es muy apreciada! ¡Muchas gracias!

  • Controlar: github.com/cucumber/cucumber-jvm/issues/…

    – Diputado Korstanje

    16 de abril de 2019 a las 14:36

  • ¡Gracias por su respuesta! Trabajamos en un entorno Windows. Verificamos ese problema, pero de alguna manera sería útil más orientación. ¿Podría estar también relacionado con esto? github.com/cucumber/cucumber-jvm/issues/1540 ?

    – Lavinia

    16 de abril de 2019 a las 14:44

  • No es probable ya que está cargando desde un frasco de resorte. Lea atentamente el billete. Solo puede acceder a los recursos en un spring-jar a través de ApplicationContext.

    – Diputado Korstanje

    16 de abril de 2019 a las 14:56

  • Tal vez sea una pregunta secundaria, pero nos dimos cuenta de que no estamos usando las últimas versiones de los frascos (se especifica arriba la versión de cada uno de ellos). Pero el cucumber-core-1.2.5.jar se lanzó en 2016-09-12 y ahora el último lanzamiento es 4.3.0; Intentamos obtener los archivos jar más recientes para todas las dependencias, pero eso no funcionó, parecen ser incompatibles. ¿Hay una tabla de compatibilidad de frascos para todos los frascos relacionados con pepino y pepinillo?

    – Lavinia

    16 de abril de 2019 a las 18:23

  • me gustaría fuertemente recomiendo usar maven, gradle o incluso appache ivy para la gestión de dependencias. Pero si debe hacerlo a mano, aún puede analizar manualmente el pom. Están disponibles en maven central.

    – Diputado Korstanje

    16 de abril de 2019 a las 18:57

Avatar de usuario de Noel Yap
noel yap

Usando Gradle, coloque los artefactos de Cucumber (es decir, características, implementaciones de pasos, etc.) en un subproyecto, por ejemplo my-cucumber-testsseparado de la aplicación Spring Boot.

Luego, en build.gradle de la aplicación Spring Boot, agregue:

bootJar {
  // make backend, features, and steps available to Cucumber at runtime
  requiresUnpack '**/my-cucumber-tests-*.jar', '**/cucumber-java-*.jar'
}

¿Ha sido útil esta solución?