[英]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.