Напишите кросс-платформенные модульные тесты, которые обрабатывают утверждения в конце строки - PullRequest
0 голосов
/ 30 сентября 2018

Я использую JUnit для проверки распечатки программы.Я делаю это, устанавливая System.out на свой собственный PrintStream, который печатает на ByteArrayOutputStream.Мои тесты обычно выглядят так:

assertEquals("Some line of text\r\n", output);

Мне интересно, как заставить этот код работать на разных платформах.Если я выполню эти тесты на Linux, все эти тесты не пройдут.Я мог бы написать более сложные тесты, которые бы принимали либо \r\n, либо \n в выводе, но я хотел бы, чтобы тесты были простыми, если это возможно.Есть ли способ установить тип новой строки, напечатанный println()?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

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

Таким образом, мне все равно, какие специфичные для платформы символы используются выходными данными для новых строк, потому что об этом заботится читатель, а я сравниваю только отдельные строки.

0 голосов
/ 30 сентября 2018

Для JUnit 4 есть библиотека Системные правила , которая помогает с такого рода тестами.Он также поддерживает нормализацию концов строк.Тест будет выглядеть так:

public class MyTest {
  @Rule
  public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();

  @Test
  public void writesTextToSystemOut() {
    System.out.print(String.format("Some line of text%n)");
    assertEquals(
      "Some line of text\n",
      systemOutRule.getLogWithNormalizedLineSeparator()
    );
  }
}

Полное раскрытие: я являюсь автором Системных правил.

0 голосов
/ 30 сентября 2018

Вы должны сохранить поведение системы по умолчанию и изменить свой код подтверждения:

String EOL = System.getProperty("line.separator")
assertEquals("Some line of text" + EOL, output);

Почему?EOL (конец строки, или разделитель строк) зависит от системы, если вы измените поведение по умолчанию, вы МОЖЕТЕ встретить другие странные ошибки.

В вашем случае вам достаточно изменитьEOL в вашей собственной строке.

Другие (возможно, не очень хорошие) методы могут включать в себя: заменить все \r\n и \r на \n и использовать \n для сравнения всех выходных данных, не использовать PrintStream но строите строку самостоятельно и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...