Gradle для Android: почему javaexec не обнаруживает мой путь к классам? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть проект Android (в Windows), где я пытаюсь запустить cucumber-jvm как неинструментированный «модульный тест».Т.е. выполнять функции Cucumber при запуске gradlew test.

Вот соответствующие биты моего приложения 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'
}

Когда я запускаю gradlew test --info в командной строке Iполучить следующую ошибку:

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

Мне кажется, что команда не содержит пути к классам, и мой вопрос - Почему?

PS - я подтвердил, чтово время вызова javaexec вызов getClasspath() действительно содержит все зависимости с этим небольшим битом Groovy: println getClasspath().any { println it }

PPS - я знаю предполагаемое использованиеcucumber-jvm предназначен для инструментальных тестов с использованием cucumber-android .У меня есть конкретный вариант использования для запуска Cucumber в качестве «локального модульного теста» (термины Android, а не мой), так что приведенное выше не очень мне помогает.

1 Ответ

0 голосов
/ 24 сентября 2018

Мне кажется, я нашел решение для моей проблемы.Вот код, который работает для меня:

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']
        }
    }
}

Мне кажется, что мой оригинальный вызов getClassPath() в закрытии javaexec возвращал пустую коллекцию файлов.В то же время в закрытии для unitTests.all, getClassPath() содержит правильный путь к классу.

Путем передачи classpath из внешнего замыкания во внутреннее замыкание через переменную, cucumber.api.cli.Main теперь успешно выполняется, и мои функции Cucumber запускаются как часть задачи Gradle test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...