要添加到其他人所說,考慮以下因素:
//in your JUnit code...
public void testSquare()
{
Class classToTest = SomeApplicationClass.class;
Method privateMethod = classToTest.getMethod("computeSquare", new Class[]{Integer.class});
String result = (String)privateMethod.invoke(new Integer(3));
assertEquals("9", result);
}
在這裏,我們使用反射來執行私有方法SomeApplicationClass.computeSquare(),傳遞一個整數並返回一個字符串結果。這導致在一個JUnit測試將編譯很好,但在執行過程中失敗,如果任何的以下發生:
- 方法名稱「computeSquare」被重命名
- 該方法以在不同的參數類型(例如,改變的整數,以龍)
- 參數變化(例如通過在其它參數)
- 的方法的變化(可能是從字符串到整數)的返回類型的
不是件數,如果有沒有簡單的方法來證明computeSquare已經完成了它應該通過公共API完成的任務,那麼你的類可能會做很多事情。拉這個方法到一個新的類,它爲您提供了以下測試:
public void testSquare()
{
String result = new NumberUtils().computeSquare(new Integer(3));
assertEquals("9", result);
}
現在(特別是當你使用現代IDE的可重構工具),改變方法的名字對你的測試沒有影響(如您的IDE也將重構JUnit測試),同時更改參數類型,方法的數量或返回類型將在您的Junit測試中標記編譯錯誤,這意味着您將不會檢查編譯的JUnit測試但在運行時失敗。
我的最後一點是,有時候,特別是在使用遺留代碼時,並且需要添加新功能時,在單獨編寫好的可測試類中這樣做可能並不容易。在這種情況下,我的建議是將新的代碼更改隔離到受保護的可見性方法,您可以直接在JUnit測試代碼中執行這些方法。這使您可以開始建立測試代碼的基礎。最終,您應該重構該類並提取您的附加功能,但與此同時,新代碼的受保護的可見性有時可以成爲您在測試性方面的最佳方式,而無需進行重大重構。
你用反射,設置,獲得或兩者練習什麼樣的訪問? – fish 2010-05-11 14:00:08
@fish:我只使用get來驗證是否設置了一些特定的值 – RoflcoptrException 2010-05-11 14:02:02
Java中的常規做法是將測試放在同一個包中,以便測試「包專用」(默認訪問)類。 – 2010-05-11 14:17:23