Gradle para Android: ¿Por qué javaexec no detecta mi classpath?

2 minutos de lectura

Tengo un proyecto de Android (en Windows) donde estoy tratando de ejecutar pepino-jvm como un no instrumentado “prueba de unidad”. Es decir, ejecutar funciones de Cucumber cuando ejecuto gradlew test.

Aquí están los bits relevantes de mi aplicación build.gradle:

android {
    ...
    testOptions {
        unitTests.all {
            javaexec {
                main = "cucumber.api.cli.Main"
                classpath = getClasspath()
                args = ['--plugin', 'pretty', '--glue', 'gradle.cucumber', 'src/test/java/cucumber/assets']
            }
        }
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    testImplementation 'io.cucumber:cucumber-java:3.0.2'
    testImplementation 'io.cucumber:cucumber-junit:3.0.2'
}

cuando corro gradlew test --info en la línea de comandos me sale el siguiente error:

Starting process 'command 'C:\Program Files\Java\jdk1.8.0_162\bin\java.exe''. Working directory: C:\dev\urig\android-cucumber\app Command: C:\Program Files\Java\jdk1.8.0_162\bin\java.exe -Dfile.encoding=windows-1252 -Duser.country=US -Duser.language=en -Duser.variant cucumber.api.cli.Main --plugin pretty --glue gradle.cucumber src/test/java/cucumber/assets
Successfully started process 'command 'C:\Program Files\Java\jdk1.8.0_162\bin\java.exe''
Error: Could not find or load main class cucumber.api.cli.Main

Me parece que el comando no contiene classpath y mi pregunta es: ¿por qué?

PD – He comprobado que en el momento de la llamada a javaexec la llamada a getClasspath() de hecho contiene todas las dependencias con este poco de Groovy: println getClasspath().any { println it }

PPS – Sé que el uso previsto de pepino-jvm es para instrumentado pruebas usando pepino-android. Tengo un caso de uso específico para ejecutar Cucumber como una “prueba de unidad local” (términos de Android, no los míos), por lo que lo anterior no me ayuda.

avatar de usuario de urig
urig

Creo que he encontrado una solución para mi problema. Aquí está el código que funciona para mí:

testOptions {
    unitTests.all {
        def classpath2 = getClasspath()
        javaexec {
            main = "cucumber.api.cli.Main"
            classpath = classpath2
            args = ['--plugin', 'pretty', '--glue', 'gradle.cucumber', 'src/test/java/cucumber/assets']
        }
    }
}

Me parece que mi llamado original a getClassPath() dentro de javaexec El cierre devolvía una colección de archivos vacía. Al mismo tiempo, en el cierre por unitTests.all, getClassPath() contiene el classpath correcto.

Al pasar el classpath del cierre externo al cierre interno a través de una variable, cucumber.api.cli.Main ahora se ejecuta correctamente y mis características de Cucumber se ejecutan como parte de Gradle test tarea.

¿Ha sido útil esta solución?