Тестирование вывода в консоль JUnit5
Пишу Unit тесты для приложения. Возникла необходимость написать тест для метода removeTask(filename, taskId). Ожидаемым поведением при некорректном id является вывод в консоль System.out.println("Неверный номер задачи."). Проверяю это в тесте следующим образом. Перед каждым тестом выполняется следующий фрагмент кода:
@BeforeEach
public void setUpStreams() {
System.setOut(new PrintStream(output));
}
@BeforeEach
public void createTestList() throws IOException {
String filepath = "testfiles/test.json";
String taskName = "task1";
String taskDescription = "This is the first task";
WorkWithJson.createTaskList(filepath, taskName, taskDescription);
}
Задается поток вывода
protected final ByteArrayOutputStream output = new ByteArrayOutputStream();
и создается новый список с одним элементом, его taskId = 1. Сам код теста для некорректного id:
@org.junit.jupiter.api.Test
void removeTaskIncorrectId() {
String filepath, expResult, actResult;
filepath = "testfiles/test.json";
int taskId = 0;
expResult = "Неверный номер задачи.\n";
WorkWithJson.removeTask(filepath, taskId);
actResult = output.toString();
assertEquals(expResult, actResult);
}
Проблема в следующем. При прохождении теста возникает AssertionFailedError, указано, что Contents have differences only in line separators (см. скриншот). Не могу понять, как исправить эту проблему.
Ответы (2 шт):
Решил проблему следующим образом – убрал из строк сепараторы, сравнивал без них:
expResult = expResult.replaceAll("\n", "").replaceAll("\r", "");
actResult = actResult.replaceAll("\n", "").replaceAll("\r", "");
Теперь тест работает корректно. Вопрос решен.
Как вариант, используя JUnit5 и Assertj, можно сравнивать строки без учёта line separators (\r, \n, \r\n)
import static org.assertj.core.api.Assertions.assertThat;
...
assertThat(resultString).isEqualToIgnoringWhitespace(expectedString);
