我有一個任務來測試控制檯應用程序。我可以訪問一個方法,但也想檢查字符串格式是否正常工作。閱讀System.out Java測試
由於此方法不返回字符串,而是打印到控制檯,有沒有辦法可以攔截列表打印行?
測試這類事情是否有意義?
我有一個任務來測試控制檯應用程序。我可以訪問一個方法,但也想檢查字符串格式是否正常工作。閱讀System.out Java測試
由於此方法不返回字符串,而是打印到控制檯,有沒有辦法可以攔截列表打印行?
測試這類事情是否有意義?
下面是一個示例如何捕捉輸出到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!);
}
}
然後你就可以使用模擬輕鬆地測試(用的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),而無需修改你的實際代碼。
看到這個:http://stackoverflow.com/questions/3228427/redirect-system-out-println –
你有修改正在測試的代碼的選項,還是必須按原樣進行測試? –
沒有。不幸的是,它出界了。我正在測試它正在調用的方法,但也想測試傳遞到控制檯的輸出。 –