这个问题已经在2009年被问到( JUnit测试System.out.println() )。有两个“主要”解决方案:
ByteArrayOutputStream()。在阅读了系统规则API之后,它看起来更容易使用,也更友好。
问题是,在网上快速搜索后,它似乎不太受欢迎。
在2017年对System.out进行JUnit测试的最普遍的方法是什么?
发布于 2017-08-01 13:40:11
我认为2017年的答案应该是这样的:
System.out获取内容的单元测试。Github 显示认为系统规则仍然是“活的”(在决定是否使用第三方库时,这始终是一个好迹象)--而且在这里停留8年意味着它可能是一个成熟的产品。因此:当添加这个外部依赖对您来说是可以的,只需去做它。
但当然:真正的答案仍然是:避免写这样的测试。没有什么比搜索“but”更糟糕的了,因为遗留的单元测试突然失败--因为一些输出消息包含一个空格,而不是一个选项卡,所有这些都是出于某种愚蠢的原因。意思:编写直接发射字符串的代码,并让单元测试检查这些代码。
然后进行一个集成/功能测试,以确保您的“管道”是正确的,并且这种“发出的”字符串在某个时候会在System.out中结束。
鉴于“任择议定书”的评论--这正好印证了我的观点。问题是这样的代码:
Scanner scanner = new Scanner(System.in);
if (scanner.next().equals("whatever")) {
System.out.println("well"));
}它将直接依赖于System.in和System.out。因此,为了测试上面的代码,我们以某种方式操纵了System.in和System.out。现在看看下面的代码:
public class InOutExample {
private final Scanner scanner;
private final OutputStream out;
public InOutExample() {
this(new Scanner(), System.out);
}
/** unit test only */
InOutExample(Scanner scanner, OutputStream out) {
this.scanner = scanner;
this.out = out;
}
public void foo() {
if (scanner.next().equals("whatever")) {
out.println("well"));
}
}以上允许您完全单元测试您的foo()方法。为什么?因为您可以传递任何扫描器重新定位。对象到所需的示例类中。您可以为这两个对象编写自己的存根实现,也可以模拟对象,并使用模拟框架的verification功能来检查是否将预期的字符串准确地发送到特殊的 OutputStream out!
https://stackoverflow.com/questions/45439345
复制相似问题