2013-12-17 125 views
2

所以我創建了一個日誌函數,以便我可以看到每個動作的日期。我現在想單元測試他們。因爲該函數使用void,所以我無法測試輸出。JUnit測試靜態無效方法

我可能會將void更改爲一個String,但隨後將它作爲void使用的點將消失!

我有什麼選擇?

public class Logger { 

    public static void log(String s) { 
     Date d = new Date(); 
     SimpleDateFormat ft = 
       new SimpleDateFormat ("yyyy.MM.dd '-' hh:mm:ss"); 
     System.out.println("[" + ft.format(d) + "]: " + s); 
    } 

} 

的JUnit

@Test 
public void testLoggerEmptyString() { 
    String s = ""; 
    log(s); 
} 

感謝:d

回答

5

你需要測試你的方法的副作用。在這種情況下,您想觀察的副作用是寫入System.out的內容。您可以使用System.setOut安裝您自己的OutputStream。從那裏你可以驗證寫了什麼。

例如:

String s = "your message"; 
ByteArrayOutputStream sink = new ByteArrayOutputStream(); 
System.setOut(new PrintStream(sink, true)); 
log(s); 
assertThat(new String(sink.toByteArray()), containsString(s)); 
+0

+1這個想法! –

+0

只需記住在完成後設置System.out! – dkatzel

0

我可能會改變無效的字符串,但是如果使用它作爲一個空白點就會消失!

我不這麼認爲。如果你的方法是這樣的:

public static String getLogMessage(String s) { 
    Date d = new Date(); 
    SimpleDateFormat ft = new SimpleDateFormat ("yyyy.MM.dd '-' hh:mm:ss"); 
    return String.format("[%s] %s", ft.format(d), s); 
} 

您可以測試輸出,並在代碼中使用它

System.out.println(Whatever.getLogMessage("Foo for the world")); 

甚至

System.err.println(Whatever.getLogMessage("Holy shit!")); 
1

您可以使用該庫System Rules。在測試之後它會自動設置System.out

public void MyTest { 
    @Rule 
    public final StandardOutputStreamLog log = new StandardOutputStreamLog(); 

    @Test 
    public void testLoggerEmptyString() { 
    log("hello world"); 
    assertEquals("hello world", log.getLog()); 
    } 
}