Модульное тестирование Android Studio: чтение данных (входной) файл



в модульном тесте, как я могу прочитать данные из файла json на моем (desktop) файловой системы, без жесткого кодирования пути?



Я хотел бы прочитать тестовый ввод (для моих методов синтаксического анализа) из файла вместо создания статических строк.



файл находится в том же месте, что и мой код модульного тестирования, но я также могу разместить его где-то еще в проекте, если это необходимо. Я использую Android Studio.

628   5  

5 ответов:

в зависимости от android-gradle-plugin версия:

1. версии 1.5 и выше:

просто поместите файл json в src/test/resources/test.json и ссылаться на него, как

classLoader.getResource("test.json"). 

никакая модификация gradle не требуется.

2. версии ниже 1.5: (или если по какой-то причине выше решение не работает)

  1. убедитесь, что вы используете по крайней мере Android Gradle плагин версии 1.1. Перейдите по ссылке для настройки Android Studio правильно.

  2. создать . Android Studio должен отметить их следующим образом:

    enter image description here

  3. создать gradle задача скопировать ресурсы в каталог классов, чтобы сделать их видимыми для classloader:

    android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
    
  4. вы можете использовать этот метод, чтобы получить 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());
    }
    
  5. выполнить модульный тест с помощью 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

    Ничего не найдено.