Тестовый пример Println: println и ожидаемый вывод одинаковы, но тест не пройден

Вот код для простого тестового случая, который я делаю прямо сейчас:

private static final ByteArrayOutputStream OUTCONTENT = new ByteArrayOutputStream();
private static final PrintStream OLD_STD_OUT = System.out;

@Before
public  void setUp() {       
    System.setOut(new PrintStream(OUTCONTENT));
}

@After
public  void tearDown(){
     System.setOut(OLD_STD_OUT);
}

@Test
 public void consolePrintResetTest(){
     consolePrintReset();
     assertEquals("Les statistiques ont été réinitialisées avec succès! \n", OUTCONTENT.toString());
}

и метод, который я тестирую:

 public static void consolePrintReset(){
       System.out.println("Les statistiques ont été réinitialisées avec succès!");
 }

А вот скриншот того, что происходит: http://puu.sh/vpY3b/9a398d0b41.png

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

Спасибо, что нашли время, чтобы прочитать мой вопрос!


person Alexandre Fernandes Bartolomeu    schedule 20.04.2017    source источник
comment
Есть место! "Les statistiques ont été réinitialisées avec succès! \n" - человек не видит, а компьютер видит.   -  person Elliott Frisch    schedule 20.04.2017
comment
Собственно, в этом случае человек МОЖЕТ это увидеть... если он/она прочитает исходный код :-)   -  person Stephen C    schedule 20.04.2017
comment
Я знаю, но это не решение моей проблемы! Если я не поставлю пробел, между ними будет разница, как видно на этом снимке экрана: puu. ш/vpYpS/7e1f64e902.png   -  person Alexandre Fernandes Bartolomeu    schedule 20.04.2017
comment
Я знаю, что это про ln, так как, когда я вручную ввожу system.out.print, он работает, но с ln он не работает, независимо от того, как я ставлю \n или нет.   -  person Alexandre Fernandes Bartolomeu    schedule 20.04.2017
comment
ОК ... так что, возможно, это разница между буквальным \n и тем, что println выводит как подобный терминатор. Вы работаете на Linux, Windows или Mac?   -  person Stephen C    schedule 20.04.2017
comment
Я работаю в Windows.   -  person Alexandre Fernandes Bartolomeu    schedule 20.04.2017
comment
Спасибо за быстрый прием.   -  person GhostCat    schedule 20.04.2017


Ответы (2)


Дело в том, что ваше утверждение ожидает "\n" в конце строки. Но разрыв строки зависит от вашей операционной системы.

Таким образом: просто вызовите trim() для захваченной выходной строки и удалите этот разрыв строки из ожидаемого результата.

Отредактируйте комментарии OP:

  • В реальном приложении запись в System.out обычно не выполняется; если вообще вы используете какую-то структуру ведения журнала.
  • Также нет особого смысла проверять, что вывод выглядит в точности так, как вы ожидаете. Это означает, что каждый раз, когда вы меняете сообщение, тест прерывается. Не полезно.
  • Если вообще, лучше убедиться, что какой-то объект регистратора, например, видел определенный вызов журнала, «содержащий» какое-то важное ключевое слово или что-то в этом роде.
  • В вашем случае непонятно, чего вы хотите добиться! Видите ли, когда вы вызываете какой-то «тестируемый метод»; код там выполняется; и когда есть вызов System.out.println(); этот звонок засчитывается для вашего страхового покрытия, когда он происходит. Добавление контрольного примера, проверяющего, что запись действительно имела место, никак не поможет вашему покрытию. Имейте в виду: вы измеряете покрытие вашего производственного кода. Проверка работоспособности System.out.print (обычно работает ;-) не помогает охвату вашего производственного кода.
person GhostCat    schedule 20.04.2017
comment
Спасибо, это была проблема! - person Alexandre Fernandes Bartolomeu; 20.04.2017
comment
Мне любопытно. Я понимаю, почему это не имеет большого значения, но если у вас есть больше информации об этом, я всегда рад узнать что-то новое. Что касается того, почему я тестирую это для задания. Мне нужно выполнить 80% тестового покрытия, а это составляет более 300 тестов согласно отчету о покрытии кода. Так что, если я могу сделать несколько быстрых, я буду рад этому, независимо от того, насколько они полезны (поскольку это не оценивается для этого задания). - person Alexandre Fernandes Bartolomeu; 20.04.2017
comment
@AlexandreFernandesBartolomeu Обновления есть ;-) - person GhostCat; 20.04.2017
comment
Спасибо за добавленную информацию! Это имеет смысл. Эта часть о проверке определенных ключевых слов на самом деле отличная идея. Вы правы, лол, я просто проверяю, работает ли System.out. - person Alexandre Fernandes Bartolomeu; 20.04.2017

По-видимому, ложное пространство в вашем модульном тесте — это ваша попытка решить проблему, и проблема все еще существует без него. (См. комментарии к Вопросу.)

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

 public void consolePrintResetTest(){
     consolePrintReset();
     assertEquals("Les statistiques ont été réinitialisées avec succès!" 
                  + System.lineSeparator(), OUTCONTENT.toString());
 }

В качестве альтернативы вы можете удалить разделитель строки (и любые другие начальные/конечные пробелы), используя trim().

person Stephen C    schedule 20.04.2017
comment
Я хотел бы поставить два ответа как лучший, так как ваш способ тоже работает. Спасибо за ваш ответ! - person Alexandre Fernandes Bartolomeu; 20.04.2017
comment
Поскольку ОП так счастлив, давайте разделим радость ;-) - person GhostCat; 20.04.2017