2014-02-20 62 views
1

我有一個任務來測試控制檯應用程序。我可以訪問一個方法,但也想檢查字符串格式是否正常工作。閱讀System.out Java測試

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

測試這類事情是否有意義?

+2

看到這個:http://stackoverflow.com/questions/3228427/redirect-system-out-println –

+0

你有修改正在測試的代碼的選項,還是必須按原樣進行測試? –

+0

沒有。不幸的是,它出界了。我正在測試它正在調用的方法,但也想測試傳遞到控制檯的輸出。 –

回答

4

下面是一個示例如何捕捉輸出到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()); 
1

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

0

測試此方法的方式使其具有「輸出」抽象的優良設計,而不是直接打印到「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!); 
    } 

}

然後你就可以使用模擬輕鬆地測試(用的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原則,你的類現在是「開放 - 關閉」,你可以添加功能(websocket瘋狂的例子:P),而無需修改你的實際代碼。