Файл доступа в тесте JUnit в среде Gradle

Сейчас у меня есть библиотека Java, у которой есть тестовый класс. В этом классе я хочу получить доступ к некоторым файлам, расположенным на моем жестком диске.

Файл build.gradle выглядит так:

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.11'
}

Мой файл находится под java_lib/src/test/assets/file.xml, а класс Java находится под java_lib/src/test/java/<package_name>.java

Поэтому я выполняю

final InputStream resourceAsStream = this.getClass().getResourceAsStream("assets/file.xml");

К сожалению, я возвращаюсь обратно. Что я делаю неправильно?

Ответ 1

Чтобы ускорить работу, вам нужно добавить в файл gradle следующее:

task copyTestResources(type: Copy) {
    from "${projectDir}/src/test/resources"
    into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources

В основном это копирование всех файлов в каталоге src/test/resource на build/classes/test, так как this.getClass().getClassLoader().getResourceAsStream(".") указывает на build/classes/test.

issue уже известен Google, и они хотят исправить его в Android Studio 1.2 (так как для этого нужен IntelliJ14, и похоже, что это будет включен в Android Studio 1.2)

Ответ 2

Попробуйте разместить file.xml под src/test/resources и использовать this.getClass().getResourceAsStream("file.xml") (без префикса папки)

Проблема заключается в том, что папка assets не является частью пути к тестовой среде выполнения, поэтому this.getClass().getResourceAsStream("assets/file.xml") не сможет разрешить путь, как вы ожидали.

По умолчанию папка тестовых ресурсов в проекте java Gradle имеет значение src/test/resources (то же, что и проект Maven java). Вы можете переопределить его в папку assets, если хотите, добавив это в файл проекта build.gradle:

sourceSets.test {
    resources.srcDirs = ["src/test/assets"]
}

Ответ 3

В build.gradle добавьте это:

sourceSets.test {
    resources.srcDirs = ["src/test"]
}

В своем коде, обратитесь к вашему ресурсу следующим образом:

getClass().getClassLoader().getResourceAsStream("assets/file.xml"));

Работает для меня.

Ответ 4

Спасибо за указание Google issue Я искал весь день для этого...

В "Android Studio 1.1 RC 1" (gradle инструмент сборки 1.1.0-rc1) нет необходимости добавлять работу в файл gradle, но вы должны выполнить тест из gradle меню задач (или командной строки)!