Java 在JUnit测试中,是否可以检查System.out.println()方法

Java 在JUnit测试中,是否可以检查System.out.println()方法,java,unit-testing,io,Java,Unit Testing,Io,可能重复: 是否可以通过JUnit测试检查方法System.out.println(“一,二”)是否实际打印了一,二?是的,您可以将默认System.out更改为文件、缓冲区等,并对新流进行单元测试,以获得预期的数据。但在我看来,这是一个可怕的想法 另一种方法是使用一个记录器来代替标准输出和对日志进行单元测试,但再一次,对记录器进行单元测试听起来很奇怪。至少如果您没有开发测井工具:) 对我来说,这听起来像是对什么是单元测试的错误理解,但我可能错了。更好的办法是不直接使用System.out将应

可能重复:


是否可以通过JUnit测试检查方法System.out.println(“一,二”)是否实际打印了一,二?

是的,您可以将默认System.out更改为文件、缓冲区等,并对新流进行单元测试,以获得预期的数据。但在我看来,这是一个可怕的想法

另一种方法是使用一个记录器来代替标准输出和对日志进行单元测试,但再一次,对记录器进行单元测试听起来很奇怪。至少如果您没有开发测井工具:)


对我来说,这听起来像是对什么是单元测试的错误理解,但我可能错了。

更好的办法是不直接使用System.out将应用程序更改为更易于测试

  • 如果您尝试测试的方法是为最终用户编写输出而设计的,请修改它或封闭类,以便目标OutputStream或PrintWriter或任何参数

  • 另一方面,如果该方法正在生成日志输出,请使用适当的日志框架。。。并考虑是否有必要对日志输出进行单元测试。


请参阅@bunting,这是可以完成的,但我建议您仅在无法重构代码的情况下使用该方法。如果您正在测试新代码,这看起来像是一种代码气味。您想测试Java核心库方法吗?为什么?我知道什么是单元测试,我可以很容易地将system.out.println转换为数组、列表或任何类型的容器,这样更容易测试。如果方法本身能够被测试,那就走着瞧吧。