Как в модульном тесте я могу прочитать данные из файла json в моей (настольной) файловой системе без жесткого кодирования пути?
Я хотел бы читать тестовый ввод (для моих методов синтаксического анализа) из файла вместо создания статических строк.
Файл находится в том же месте, что и мой код модульного тестирования, но при необходимости я могу разместить его в другом месте проекта. Я использую Android Studio.
test_documents.json
? каталог активов?Ответы:
В зависимости от
android-gradle-plugin
версии:1. версия 1.5 и выше:
Просто поместите файл json и укажите
src/test/resources/test.json
его какНикакой модификации gradle не требуется.
2. версия ниже 1.5 : (или если по какой-то причине вышеуказанное решение не работает)
Убедитесь, что вы используете как минимум Android Gradle Plugin версии 1.1 . Перейдите по ссылке, чтобы правильно настроить Android Studio.
Создать
test
каталог. Поместите классы модульного теста вjava
каталог и поместите файл ресурсов вres
каталог. Android Studio должна пометить их следующим образом:Создайте
gradle
задачу для копирования ресурсов в каталог классов, чтобы сделать их видимыми дляclassloader
:Теперь вы можете использовать этот метод для получения
File
ссылки на файловый ресурс:источник
src/test/resources/test.json
и укажите на него ссылкуclassLoader.getResource("test.json")
. Никакой модификации gradle не требуется. Вложенные папки внутриresources
тоже работают.classLoader
? где разместить эту строчку кода? что вы можете сделать с возвращаемым результатом ?. Пожалуйста, предоставьте более полный код. -1./src/test/resources/file.txt
в Котлине:TestClassName::class.java.getResource("/file.txt")!!.readText()
Для локальных модульных тестов (в
src/test/resources
отличие от инструментальных) вы можете размещать файлы и читать их с помощью classLoader. Например, следующий код открываетmyFile.txt
файл в каталоге ресурсов.Он работал с
источник
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
В моем случае решение заключалось в том, чтобы добавить в файл gradle
После этого все было найдено AS 2.3.1
источник
root/app/src/test/resources/test.json
2. прочитать такие данные:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
У меня было много проблем с тестовыми ресурсами в Android Studio, поэтому я настроил несколько тестов для ясности. В моем
mobile
проекте (Приложение для Android) я добавил следующие файлы:Тестовый класс (все тесты проходят):
В том же корне проект У меня есть проект Java (не Android) под названием
data
. Если я добавлю те же файлы в проект данных:Тогда все вышеперечисленные тесты не пройдут, если я выполню их из Android Studio, но они передадут командную строку с
./gradlew data:test
. Чтобы обойти это, я использую этот хак (в Groovy)Использование:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
источник
getClassLoader()
версии работают как положено. Т.е. они находят файлы, запускаемые как из Android Studio, так и из командной строки на моем компьютере с macOS и на сервере Linux CI (CircleCI). Так что я иду с этим и надеюсь, что Gradle 3.3 не сломает его позже ...build/resources/test
не включены в интерактивный путь к классам.Если вы перейдете в Run -> Edit configurations -> JUnit, а затем выберите конфигурацию запуска для своих модульных тестов, появится параметр «Рабочий каталог». Это должно указывать на то, где находится ваш файл json. Имейте в виду, что это может нарушить другие тесты.
источник
new File()
или аналогичного, но он не работает напрямую с методом загрузки пути к классам, описанным выше. Это также немного сложно, потому что каждая новая конфигурация запуска должна устанавливать рабочий каталог, и по умолчанию AS и командная строка Gradle любят использовать разные рабочие каталоги ... такая больЯ подумал, что должен добавить сюда свои выводы. Я знаю, что это немного устарело, но для более новых версий Gradle, где нет каталога src / test / resources, а есть только один каталог ресурсов для всего проекта, вам нужно добавить эту строку в свой файл Gradle.
Сделав это, вы можете получить доступ к своему ресурсу с помощью:
Я искал это и не мог найти ответа, поэтому решил помочь другим здесь.
источник
Собственно, это то, что у меня сработало с инструментальными тестами (запуск Android Studio версии 3.5.3 , Android Gradle Plugin версии 3.5.3 , Gradle версии 6.0.1 ):
src/androidTest/assets
папкуInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
источник