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

Java Println测试用例:Println和预期输出相同,但测试失败,java,junit,println,Java,Junit,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))

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

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!");
 }
下面是发生的情况的屏幕截图:

我很确定我忽略了一些非常愚蠢的东西,但是我没有找到让这个测试用例工作的明显的东西。任何帮助都将不胜感激


感谢您抽出时间阅读我的问题

关键是您的断言要求在行的末尾有“\n”。但是换行取决于您的操作系统

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

按OP编辑评论:

  • 在现实世界的应用程序中,通常不会写入System.out;如果有的话,您正在使用一些日志框架
  • 检查输出是否与您期望的完全一致也没有多大意义。这意味着每次更改消息时,测试都将中断。没有帮助
  • 如果有的话,我们宁愿确保某个记录器对象(例如)看到一个特定的日志调用,“包含”一些重要的关键字等等
  • 在你的情况下,还不清楚你打算实现什么!你看,当你调用某个“测试中的方法”时;其中的代码被执行;当有System.out.println()调用时;该电话在发生时会被计入您的覆盖范围。添加一个测试用例来检查编写是否真的发生了,这对您的覆盖率没有任何帮助。请记住:您要衡量生产代码的覆盖率。测试System.out.print是否有效(通常是;-)无助于提高生产代码的覆盖率

显然,单元测试中的伪空间是您试图修复问题的地方,没有它,问题仍然存在。(见对问题的评论。)

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

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

或者,您可以使用
trim()

删除行终止符(以及任何其他前导/尾随空格)有空格
“Les statistiques ontétéréinitialisées avec success!\n”
-人类看不见,但计算机可以。实际上,在这种情况下,人类可以看到它。。。如果他/她阅读源代码:-)我知道,但这不是我问题的解决方案!如果我不放置空格,实际上两者之间存在差异,如本屏幕截图所示:我知道这是关于“ln”的,因为当我手动输入system.out.print时,它工作,但对于ln它不工作,无论我如何放置\n,或者不。OK。。。因此,可能是文字
\n
println
作为类似终止符输出的内容之间的差异。您是在Linux、Windows还是Mac上运行?谢谢,这就是问题所在!我确实很好奇。我理解为什么它没有提供太多的价值,但是如果你有更多关于它的信息,我总是很乐意学习一些新的东西。至于我为什么要测试这个是为了一个任务。我需要做80%的测试覆盖率,根据代码覆盖率报告,这代表了300多个测试。因此,如果我能做一些快速的,我很高兴,不管它们有多有用(因为这不是本次任务的评分)。@AlexandreFernandesBartolomeu更新就在那里;-)谢谢你的补充信息!这很有道理。关于检查某些关键字的部分实际上是一个好主意。你是对的,哈哈,我基本上只是在测试System.out是否有效。我希望我能把两个答案写成“最佳”,因为你的方法也有效。谢谢你的回答!既然OP如此快乐,让我们一起分享快乐;-)