Как скопировать ресурсы отладки для модульных тестов

У меня есть проект Gradle библиотеки Android. И мне нужно скопировать некоторые файлы в папку с ресурсами для модульных тестов robolectric.

Для этого я определил задачу копирования:

task copyDebugAssets(type: Copy)  {
    from "${projectDir}/somewhere"
    into "${buildDir}/intermediates/bundles/debug/assets"
}

но я не могу добавить эту задачу в качестве зависимости для задачи processDebugResources:

processDebugResources.dependsOn copyDebugAssets

из-за этой ошибки:

Не удалось получить неизвестное свойство «processDebugResources» для объекта типа com.android.build.gradle.LibraryExtension.

Теперь мне нужно вручную выполнить эту задачу перед модульным тестом:

./gradlew clean copyDebugAssets test

Как я могу это решить?


person Kirill    schedule 05.11.2016    source источник


Ответы (2)


Плагин для Android динамически добавляет несколько задач. Ваша строка .dependsOn не работает, потому что в то время, когда gradle пытается обработать эту строку, задача processDebugResources еще доступна. Вы должны указать gradle добавить зависимость, как только будет доступна восходящая задача:

tasks.whenTaskAdded { task ->
  if (task.name == 'processDebugResources') {
    task.dependsOn copyDebugAssets 
  }
}
person RaGe    schedule 03.01.2017
comment
Большое спасибо, работает! Как вы думаете, это правильный способ копирования ресурсов с пользовательской задачей, или, может быть, я должен выбрать другой подход? - person Kirill; 03.01.2017
comment
Я согласен с @commonsware, изменение настроек вашего проекта, чтобы указать, где находятся ваши активы, лучше, чем копирование. - person RaGe; 03.01.2017

Зачем копировать? Настройте, откуда должны извлекаться активы:

android {
    // other cool stuff here

    sourceSets {
        androidTest {
            assets.srcDirs = ['../testAssets']
        }
    }
}

(заменив ../testAssets на путь к источнику ресурсов)

Я успешно использовал это с androidTest для инструментального тестирования. Насколько я знаю, это должно работать для test или любого другого исходного набора.

person CommonsWare    schedule 03.01.2017
comment
Спасибо за ответ! Я пробовал вашу конфигурацию, но она не удалась. Robolectric AssetManager пытается загрузить активы из ./build/intermediates/bundles/<debug|release>/assets, однако эта папка всегда пуста. - person Kirill; 03.01.2017