Println 测试用例:println 和预期输出相同,但测试失败

Println test case : println and expected output are the same, but test failed

这是我现在正在做的一个简单测试用例的代码:

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

我很确定我忽略了一些非常愚蠢的东西,但我没有发现我缺少什么明显的东西来使这个测试用例工作。任何帮助将不胜感激。

感谢您花时间阅读我的问题!

重点是你的断言期望行尾有“\n”。但是换行符确实取决于您的操作系统。

因此:只需对捕获的输出字符串调用 trim() 并从预期结果中删除该换行符。

编辑 OP 的评论:

  • 在现实世界的应用程序中,通常不会写入 System.out;如果有的话,你正在使用一些日志框架。
  • 检查输出是否完全符合您的预期也没有多大意义。这意味着每次更改 消息 时,测试都会中断。没有帮助。
  • 如果有的话,人们宁愿确保某些记录器对象看到特定的日志调用,"containing" 一些重要的关键字。
  • 在你的情况下,不清楚你打算实现什么!你看,当你调用一些 "method under test";那里的代码被执行;当有 System.out.println() 调用时;该电话发生时,您的报道会得到计数。添加一个测试用例来检查写入是否确实发生对您的覆盖率根本没有帮助。请记住:您衡量生产代码的覆盖率。测试 System.out.print 是否有效(它通常有效 ;-) 无助于您的生产代码中的覆盖范围。

显然,你单元测试中的虚假 space 是你试图解决问题的尝试,没有它问题仍然存在。 (见问题评论。)

在这种情况下,问题很可能是您系统的行分隔符不是简单的换行符。下面是如何编写独立于测试平台的测试;即在 Windows、Linux 和 MacOSX ...

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

或者,您可以使用 trim().

去除行终止符(以及任何其他前导/尾随白色space)