Модульные тесты Android - нет такого свойства: bootClasspath

Я пытаюсь выполнить простой тестовый пример для Android после только что объявленной поддержки модульного тестирования - http://tools.android.com/tech-docs/unit-testing-support

Внимательно следуя пошаговому руководству, я пытаюсь запустить ./gradlew test. Я получаю эту ошибку:

Execution failed for task ':app:compileDebugGroovy'.
> No such property: bootClasspath for class: com.android.build.gradle.AppPlugin

при использовании com.android.tools.build:gradle:1.1.0-rc1.

Кто-нибудь еще застрял на этом?


person Wojtek Erbetowski    schedule 10.02.2015    source источник
comment
Я получаю ту же ошибку с только что проверенным Deccard-Gradle и изменяю версию Gradle на com.android.tools.build:gradle:1.1.0-rc1   -  person Erik B    schedule 12.02.2015
comment
Это выглядит как шаг в правильном направлении, но я не могу заставить конфигурацию запуска JUnit распознавать модульные тесты.   -  person Erik B    schedule 12.02.2015
comment
Забыл свои варианты сборки, теперь он работает в клонированном проекте, указанном выше. Все еще пытаюсь включить в свой проект.   -  person Erik B    schedule 12.02.2015
comment
Можете ли вы опубликовать свои 2 файла build.gradle (модуль и проект)?   -  person Simas    schedule 13.02.2015
comment
Вы можете найти дальнейшее расследование в моем собственном ответе.   -  person Wojtek Erbetowski    schedule 18.02.2015
comment
@WojtekErbetowski В своем вопросе вы должны были сказать, что используете groovy-android-gradle -plugin вместо того, чтобы позволить нам догадаться об этом по названию задачи, поскольку ваша проблема очень специфична для этого плагина.   -  person sschuberth    schedule 19.02.2015
comment
@ssschuberth правда :-( Я пропустил эту очень важную часть! Извините   -  person Wojtek Erbetowski    schedule 19.02.2015


Ответы (3)


Проблема в том, что подключаемый модуль Groovy Android Gradle (чтобы Groovy работал на Android) не просто работает с подключаемым модулем Android в версии 1.1.0-rcX.

Вот очень интересный фрагмент кода непосредственно из groovyx.grooid.GroovyAndroidPlugin версии 0.3.5 (текущая последняя, ​​вот источник)

    def getRuntimeJars(Project project, plugin) {
    int index
    switch (getAndroidPluginVersion(project)) {
        case ~/0\.9\..*/:
            index = 0
            break
        case ~/0\.10\..*/:
        case ~/0\.11\..*/:
        case ~/0\.12\..*/:
        case ~/0\.13\..*/:
        case ~/0\.14\..*/:
        case ~/1\.0\..*/:
            index = 1
            break
        default:
            index = RUNTIMEJARS_COMPAT.size()-1
    }
    def fun = RUNTIMEJARS_COMPAT[index]
    fun(plugin)
}

и определение RUNTIMEJARS_COMPAT:

private static List RUNTIMEJARS_COMPAT = [
        { it.runtimeJars },
        { it.bootClasspath }
]

Так что этот API должен был измениться в Android Gradle между 0.9.x и 0.10.0 (да, я знаю - эти разработчики Google меняют там все :[ ). Итак, давайте взглянем на этот класс создания задач в Android Plugin версии 1.0.0:

> javap -cp [path to proper jar] com.android.build.gradle.AppPlugin:

public class com.android.build.gradle.AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradle.api.Plugin<org.gradle.api.Project> {
...
public java.util.List super$2$getBootClasspath();
...

Ага! Вот нужный нам метод (из родительского класса com.android.build.gradle.BasePlugin). Сейчас в версии 1.1.0-rc3 ничего подобного нет. Более того, API com.android.build.gradle.AppPlugin полностью изменен, поэтому простым if(version) это не исправить.

Я предполагаю, что нет никаких шансов, что плагин Groovy Android Gradle будет работать с модульными тестами (начиная с 1.1.0), пока авторы не обновят плагин.

Подождем тогда.

person Wojtek Erbetowski    schedule 18.02.2015
comment
Можете ли вы попробовать с 0.3.6-SNAPSHOT и сказать мне, работает ли он из коробки? Спасибо! - person melix; 23.02.2015
comment
Не найден в jcenter.bintray.com/org/codehaus/groovy/. Какой репозиторий мне нужно добавить для моментальных снимков? - person Wojtek Erbetowski; 23.02.2015
comment
Спасибо. Он проходит компиляцию и работает с 1.1.0, но нет поддержки компиляции классов тестов Groovy, поэтому пока работают только Java-тесты. Это все еще большое улучшение! - person Wojtek Erbetowski; 23.02.2015

Эта функция поддержки тестирования является экспериментальной. Тем не менее, возможно, нет быстрого решения вашей проблемы или это может быть ошибка.

Однако я бы углубился в это, прочитав сообщение: В этой строке Execution failed for task ':app:compileDebugGroovy'. упоминается задача, поэтому я бы пошел и понял, что делает эта задача. Я полагаю, это поставленная задача. Ошибка в том, что в этой задаче отсутствует свойство > No such property: bootClasspath for class: com.android.build.gradle.AppPlugin

Поэтому, возможно, попробуйте найти эту задачу и убедитесь, что свойство bootClasspath установлено для класса AppPlugin.

person Ely    schedule 16.02.2015
comment
Спасибо за подсказку, помог найти причину - person Wojtek Erbetowski; 18.02.2015

Попробуйте обновить до новой версии (RC3)

dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0-rc3'
    // ..
}

Вы также можете посмотреть здесь, чтобы сравнить текущую настройку с рабочим примером.

person bonnyz    schedule 14.02.2015
comment
К сожалению не помогло - person Wojtek Erbetowski; 16.02.2015