首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit测试System.out

JUnit测试System.out
EN

Stack Overflow用户
提问于 2017-08-01 13:32:54
回答 1查看 1K关注 0票数 1

这个问题已经在2009年被问到( JUnit测试System.out.println() )。有两个“主要”解决方案:

  1. 使用ByteArrayOutputStream()
  2. 使用系统规则(第三方)。

在阅读了系统规则API之后,它看起来更容易使用,也更友好。

问题是,在网上快速搜索后,它似乎不太受欢迎。

在2017年对System.out进行JUnit测试的最普遍的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 13:40:11

我认为2017年的答案应该是这样的:

  • 您可以使用ByteArrayOutputStream
  • 您可以使用第三方库,如系统规则
  • 您改进了设计,以避免需要进行依赖于从System.out获取内容的单元测试。

Github 显示认为系统规则仍然是“活的”(在决定是否使用第三方库时,这始终是一个好迹象)--而且在这里停留8年意味着它可能是一个成熟的产品。因此:当添加这个外部依赖对您来说是可以的,只需去做它。

但当然:真正的答案仍然是:避免写这样的测试。没有什么比搜索“but”更糟糕的了,因为遗留的单元测试突然失败--因为一些输出消息包含一个空格,而不是一个选项卡,所有这些都是出于某种愚蠢的原因。意思:编写直接发射字符串的代码,并让单元测试检查这些代码。

然后进行一个集成/功能测试,以确保您的“管道”是正确的,并且这种“发出的”字符串在某个时候会在System.out中结束。

鉴于“任择议定书”的评论--这正好印证了我的观点。问题是这样的代码:

代码语言:javascript
复制
Scanner scanner = new Scanner(System.in);
if (scanner.next().equals("whatever")) {
  System.out.println("well"));
}

它将直接依赖于System.in和System.out。因此,为了测试上面的代码,我们以某种方式操纵了System.in和System.out。现在看看下面的代码:

代码语言:javascript
复制
 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45439345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档