簡體   English   中英

閱讀System.out Java測試

[英]Reading System.out Java Test

我有一個測試控制台應用程序的任務。 我可以訪問一個方法,但也想檢查字符串格式是否正常工作。

由於此方法不返回字符串,而是打印到控制台,有沒有辦法攔截列表打印行?

測試這種東西甚至有意義嗎?

以下是如何捕獲輸出到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());

您可以使用System.setOut()System.out.println寫入重定向到PrintStream(OutputStream) 然后,您可以將OutputStream寫入String並對其進行測試。

測試它的方法是使用“輸出”抽象而不是直接打印到“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!);
  }

}

然后你可以使用mock輕松測試(例如mockito):

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原則,你的類現在是“Open-Close”,你可以添加功能(websocket瘋狂的例子:P)而無需修改你的實際代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM