Модульное тестирование Android Studio: чтение данных (входной) файл
в модульном тесте, как я могу прочитать данные из файла json на моем (desktop) файловой системы, без жесткого кодирования пути?
Я хотел бы прочитать тестовый ввод (для моих методов синтаксического анализа) из файла вместо создания статических строк.
файл находится в том же месте, что и мой код модульного тестирования, но я также могу разместить его где-то еще в проекте, если это необходимо. Я использую Android Studio.
5 ответов:
в зависимости от
android-gradle-pluginверсия:1. версии 1.5 и выше:
просто поместите файл json в
src/test/resources/test.jsonи ссылаться на него, какclassLoader.getResource("test.json").никакая модификация gradle не требуется.
2. версии ниже 1.5: (или если по какой-то причине выше решение не работает)
убедитесь, что вы используете по крайней мере Android Gradle плагин версии 1.1. Перейдите по ссылке для настройки Android Studio правильно.
создать . Android Studio должен отметить их следующим образом:
создать
gradleзадача скопировать ресурсы в каталог классов, чтобы сделать их видимыми дляclassloader:android{ ... } task copyResDirectoryToClasses(type: Copy){ from "${projectDir}/src/test/res" into "${buildDir}/intermediates/classes/test/debug/res" } assembleDebug.dependsOn(copyResDirectoryToClasses)- вы можете использовать этот метод, чтобы получить
Fileссылка для файлового ресурса:private static File getFileFromPath(Object obj, String fileName) { ClassLoader classLoader = obj.getClass().getClassLoader(); URL resource = classLoader.getResource(fileName); return new File(resource.getPath()); } @Test public void fileObjectShouldNotBeNull() throws Exception { File file = getFileFromPath(this, "res/test.json"); assertThat(file, notNullValue()); }- выполнить модульный тест с помощью Ctrl+Shift+F10 на всем типе или specyfic методе испытания.
для локальных модульных тестов (по сравнению с инструментальными тестами) вы можете поместить файлы под
src/test/resourcesи читать их с помощью загрузчика классов. Например, следующий код открываетmyFile.txtфайл в каталоге ресурсов.InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");Он работал с
- Android Studio 1.5.1
- gradle плагин 1.3.1
в моем случае решение состояло в том, чтобы добавить в файл gradle
sourceSets { test.resources.srcDirs += 'src/unitTests/resources' }после этого все было найдено, как 2.3.1
javaClass.classLoader.getResourceAsStream("countries.txt")
у меня было много проблем с тестовыми ресурсами в Android Studio, поэтому я установил несколько тестов для ясности. В моем
mobile(приложения для Android) проект я добавил следующие файлы:mobile/src/test/java/test/ResourceTest.java mobile/src/test/resources/test.txt mobile/src/test/resources/test/samePackage.txtтестовый класс (все тесты проходят):
assertTrue(getClass().getResource("test.txt") == null); assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt")); assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt")); assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt")); assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt")); assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));в том же корневом проекте у меня есть Java (не Android) project под названием
data. Если я добавлю те же файлы в проект данных:data/src/test/java/test/ResourceTest.java data/src/test/resources/test.txt data/src/test/resources/test/samePackage.txtтогда все тесты выше потерпят неудачу, если я их выполню из Android Studio, но они проходят в командной строке с
./gradlew data:test. Чтобы обойти это, я использую этот хак (в Groovy)def resource(String path) { getClass().getResource(path) ?: // Hack to load test resources when executing tests from Android Studio new File(getClass().getClassLoader().getResource('.').path .replace('/build/classes/test/', "/build/resources/test$path")) }использование:
resource('/test.txt')Android Studio 2.3, Gradle 3.3
Если вы перейдете в Run -> Edit configuration - > JUnit, а затем выберите конфигурацию запуска для своих модульных тестов, есть параметр "рабочий каталог". Это должно указывать на то, где находится ваш файл json. Имейте в виду, что это может сломать другие тесты.

Comments