Чтение XML файла в Java unit тесте: простое решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
String fileName = "example.txt";
// Для ОС Windows используется "\\" вместо "/".
InputStream is = this.getClass().getResourceAsStream("/" + fileName);
// Все переводы строк сохраняются.
String content = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))
    .lines().collect(Collectors.joining(System.lineSeparator()));

Обязательно убедитесь в том, что файл example.txt находится в директории src/test/resources, если вы используете для работы инструменты Maven или аналогичные инструменты в Gradle.

Кинга Идем в IT: пошаговый план для смены профессии

Использование InputStream для получения String

Предлагаемый подход к преобразованию InputStream в String выглядит следующим образом:

Java
Скопировать код
String result = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
                  .lines().collect(Collectors.joining("\n"));

В этом фрагменте кода применяются функциональные возможности Java 8, а также используется указанная кодировка, где оптимальным вариантом будет UTF-8.

Библиотеки, упрощающие работу

Работа с файлами становится значительно проще, если использовать такие библиотеки как Apache Commons IO и Google Guava.

Java
Скопировать код
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
// Спасибо Apache Commons IO за облегчение задачи!

Когда важен размер: работа с большими файлами

Если вы столкнулись с работой с большими файлами, стоит избегать ошибок OutOfMemoryError, исполняя чтение содержимого файла по строкам или воспользуйтеcь потоками. Важно также учесть те ситуации, когда доступ к файлу ограничен или файл не может быть найден.

Будущее уже здесь: Java NIO

С версии языка Java 7, класс java.nio.file.Files предлагает методы для эффективного чтения файлов:

Java
Скопировать код
List<String> lines = Files.readAllLines(Paths.get(resource.toURI()), StandardCharsets.UTF_8);
String content = String.join("\n", lines);
// Теперь проблемы с переводами строк в прошлом!

Визуализация

Представим, что ваш unit-тест — это кухня, а рецепт (ресурс) — необходим для приготовления блюда (теста).

Возьмём кухню(тестовую среду) 🍲 : Рецепт (ресурс) — необходимость для блюда (теста).

Чтение рецепта — Представляет собой получение списка ингредиентов (чтение текстового файла ресурса).

  1. Находим рецепт на полке (определяем расположение файла).

👀📂: Находим '"Boiled_water.txt"' в директории 'resources'.

  1. Читаем инструкции (загружаем ресурс).

📔🔍: Используем getResourceAsStream("/Boiled_water.txt") для чтения файла 'Boiled_water.txt'.

  1. Приступаем к выполнению рецепта (используем загруженный ресурс).

🍲✨: Проверяем и подтверждаем свойства, основываясь на прочитанном рецепте.

Таким образом, вы просто и легко сможете найти и использовать ресурсы, подобно опытному шеф-повару!

Построение надёжности

Важно предусмотреть обработку ошибок и исключений, которые могут возникнуть при чтении файла.

Java
Скопировать код
// Предусмотрите обработку исключений
catch(IOException ex) {
    throw new UncheckedIOException("Произошла ошибка при чтении ресурсного файла", ex);
}

Философия чистой кухни: закрытие ресурсов

Необходимо заботиться о предупреждении утечек ресурсов путём их правильного закрытия. С InputStream это проще, поскольку он автоматически закрывается:

Java
Скопировать код
try(InputStream is = this.getClass().getResourceAsStream("/example.txt")) {
  // Обработка ресурса выполняется здесь...
}
// И утечек не остаётся!

Полезные материалы

  1. Руководство пользователя JUnit 5
  2. Stack Overflow – Чтение файлов из директории ресурсов в Scala
  3. Tutorialspoint – Параметризированные тесты JUnit
  4. Пример проекта JUnit 5
  5. Vogella – Учебник по JUnit 5
  6. DZone – Работа с файлами при написании тестов в JUnit