Как сравнить файлы в тестовом примере JUnit?
Я хочу реализовать JUnit в небольшом проекте, над которым я работаю, потому что хочу немного узнать об этом.
Учебники, которые я прочитал, ссылаются на методы, которые имеют определенный вывод.
В моем случае мой вывод - это файлы, как я могу это сделать? любой простой пример?
любой подход, который мог бы помочь мне в этом?
Файлы представляют собой сырые текстовые файлы, которые создаются с помощью частного метода void.
Ответы
Ответ 1
Вы хотите получить правильный выходной файл для заданного набора входов и настроить тест для вызова своего метода void с этими входами, а затем сравнить ваш проверенный выходной файл с данными, полученными вашим методом. Вы должны убедиться, что у вас есть способ указать, куда будет выводиться ваш метод, иначе ваш тест будет очень хрупким.
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testXYZ() {
final File expected = new File("xyz.txt");
final File output = folder.newFile("xyz.txt");
TestClass.xyz(output);
Assert.assertEquals(FileUtils.readLines(expected), FileUtils.readLines(output));
}
Использует commons-io FileUtils для сравнения текстовых файлов для удобства и JUnit TemporaryFolder, чтобы гарантировать, что выходной файл никогда не существует до запуска теста.
Ответ 2
Используйте junitx.framework.FileAssert
класс из проект junit-addons. Другие ссылки:
Один из методов:
assertEquals(java.lang.String message,
java.io.Reader expected,
java.io.Reader actual)
Ответ 3
После того, как ваши методы напишут файл, в модульном тесте вы можете прочитать файл и проверить, написано ли оно правильно.
Еще одна вещь, которая имеет смысл, состоит в том, чтобы ваши методы разделились на один, который извлекает эти данные и возвращает их методам, которые просто записывают его в файл. Затем вы можете проверить, хороши ли данные, возвращенные первым методом.
И еще один вероятный подход состоял бы в том, чтобы передать OutputStream
методу, который записывает данные. В "реальном коде" вы можете передать FileOutputStream
/FileWriter
, тогда как в тестовом коде вы можете написать макетную реализацию OutputStream
и проверить, что на ней написано.
Ответ 4
Если вы не можете управлять методом для размещения вывода в потоке, я бы сказал, что вам нужно реорганизовать свой код, чтобы метод получал поток в параметре (или в конструкторе его класса).
После этого тестирование довольно просто - вы можете просто проверить поток. Легко проверяемый код обычно равен хорошему коду.
Ответ 5
Хотя ваш вопрос может показаться упрощенным, он действительно врезается в сердце модульного тестирования, нужно написать хорошо сформированный код, который можно проверить. Вот почему некоторые эксперты советуют сначала написать unit test, а затем класс реализации.
В вашем случае я предлагаю вам позволить вашему методу выполнить и создать ожидаемый файл (ы), после чего ваши unit test могут анализировать, что файлы сформированы правильно.