【问题标题】:JUnit asserting two Strings whether they're equal or notJUnit 断言两个字符串是否相等
【发布时间】:2025-12-22 12:50:10
【问题描述】:

所以我查了this question并尝试了它,但没有成功。

我的代码应该通过使用Streams 读回文本来测试该方法是否正确地将文本输出到控制台。

    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    PrintStream myStream = new PrintStream(outStream);
    System.setOut(myStream);
    o.doSomething(); //printing out Hi
    System.out.flush();
    System.setOut(savedOldStream);//setting it back to System.out
    assertEquals(outStream.toString(),"Hi");

但是每次我运行 JUnit 都会失败。 我也试过:assertTrue(outStream.toString().equals("Hi"));,但这也没有用。

这是 doSomething() 方法:

public void doSomething () {
    System.out.println("Hi");
}

【问题讨论】:

  • 没有用”是什么意思?实际发生了什么?您是否收到任何错误或只是一个失败的断言?
  • 无需重新分配System.out 来进行测试。您可以将ByteArrayOutputStream 传递给doSomething() 方法。

标签: java junit outputstream


【解决方案1】:

PrintStream#println(String str) 在字符串末尾附加一个换行符。因此,您的断言应该减少额外的行:

assertEquals(outStream.toString().trim(),"Hi");

【讨论】:

  • 写入System.out 不会在ByteArrayOutputStream 中写入任何内容。
  • 非常感谢!那么使用 System.out.print 也可以解决问题吗?
  • @Jesper OP 已重新分配System.out
  • @NhatNienne 是的,使用print 可以避免换行。
  • 同意。对于这种情况,OP 可以按照您的建议进行操作:将输出流作为参数传递。