【问题标题】:Reading System.out Java Test阅读 System.out Java 测试
【发布时间】:2014-03-21 17:26:29
【问题描述】:

我有一个测试控制台应用程序的任务。我可以访问一种方法,但也想检查字符串格式是否正常工作。

由于此方法不返回字符串,而是打印到控制台,有没有办法可以截取列表打印行?

测试这种东西是否有意义?

【问题讨论】:

  • 您可以选择修改您正在测试的代码,还是必须按原样进行测试?
  • 不。不幸的是,它超出了界限。我正在测试它正在调用的方法,但也想测试传递到控制台的输出。
  • 我相信@KevinWorkman 基本上已经回答了你的问题。您可以将 System.out 设置为您自己的 PrintStream。 (不确定,但您可能需要自己编写。)

标签: java


【解决方案1】:

以下是如何将输出捕获到 System.out 的示例:

java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();    
System.setOut(new java.io.PrintStream(out));    

System.out.println("Test output");    
System.err.println("Out was: " + out.toString());

【讨论】:

    【解决方案2】:

    您可以使用System.setOut()System.out.println 写入重定向到PrintStream(OutputStream)。然后您可以将该 OutputStream 写入 String 并对其进行测试。

    【讨论】:

      【解决方案3】:

      测试它的方法是用“输出”抽象而不是直接打印到“system.out”来制作一个好的设计。例如:

       interface Output {
          void print(String data);
       }
      

      然后你将这个依赖注入到需要向输出发送信息的类中:

      class MyProgram {
      
        private Output out;
      
        public MyProgram(Output output) {
           this.out = output;
        }
      
        public doSomething() {
           // do something
           out.print("i do something!);
        }
      

      }

      然后您可以使用模拟轻松测试(例如使用模拟):

      public void test_my_program() {
      
          Output mockOutput = mock(Output.class);
          MyProgram myProgram = new MyProgram(mockOutput);
      
          myProgram.doSomething();
      
          verity(mockOutput).print("do something!");
      }
      

      我不验证代码,但它或多或少是正确的,我希望你能明白这一点。都是一样的,测试不难,难的是设计好的可测试代码,这里我们只使用抽象和依赖注入,OO的两个基本原理。

      此代码的真正优势在于它现在不与“System.out”绑定,如果您愿意,您可以在 Web 应用程序中使用此类。例如,通过 websocket 与 Web 客户端对话的制作和输出实现。这是另一个 OO 原则,您的类现在是“打开-关闭”,您可以添加功能(websocket 疯狂示例:P)而无需修改您的实际代码。

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多