2010-08-04 107 views
4

我一直在學習關於TDD(使用JUnit),我對如何去測試void方法有疑問,在這種情況下,我不能直接使用類似assertTrue()的方法。例如返回值,說我有一個簡單的基於控制檯應用程序,它的一部分打印屏幕上的菜單,說用這個方法:測試驅動開發:無效方法

public void printMenu() 
{ 
    System.out.println("Menu:"); 
    System.out.println("1. Option ONE"); 
    System.out.println("2. Option TWO"); 
    System.out.println("3. Exit"); 
} 

我的問題是,我是不是真的有測試這個方法?如果是這樣,我該怎麼做?

回答

2

首先:測試UI很難。有些人不打擾測試這樣的事情,因爲編寫有意義的測試是非常困難的,這些測試對於無用點來說並不脆弱。我不會打擾測試這種方法。

但是:

如果你想測試菜單生成,因爲你的菜單代碼是複雜的,你需要的方式,以確保它能正常工作,你有幾個選擇。

  1. 重構您的方法,使其接受輸出流作爲參數,然後傳入輸出流,其內容可以檢查。您也可以重定向System.out來實現此目的。
  2. 重構您的方法,以便將菜單生成爲一堆對象,然後單獨打印。您可以檢查並驗證這些對象。
1

捕獲控制檯輸出,並比較期望

3

是困難的單元測試其依賴於靜態方法調用的方法。這不是一個返回的東西或void的問題。你可以做的是抽象的印刷成一個接口,讓你的類取決於這個接口上(使用構造器注入爲例):

private SomePrinterInterface _printer; 

public void printMenu() 
{ 
    _printer.println("Menu:"); 
    _printer.println("1. Option ONE"); 
    _printer.println("2. Option TWO"); 
    _printer.println("3. Exit"); 
} 

在你的單元測試,你可以嘲笑接口和驗證是否正確的方法已經呼籲它。這樣你可以獨立地測試printMenu。

1

你不能單元測試這種方法。

此方法不需要進行單元測試所需的邏輯或處理。

如果您需要單元測試打印菜單,您可以考慮將結果輸出到文本文件。 然後閱讀文本文件並比較菜單文本。