2015-06-16 123 views
0

我正在學習JUnit和測試驅動開發實踐。我有空貨幣接口:如果構造函數存在,如何使JUnit測試失敗?

它實現貨幣接口

CommonMoney類:

public class CommonMoney implements Money { 

    private CommonMoney() { 

    } 

    public static Money create(String decimalPart, Currency currency) { 
     return new Money() { 
     }; 
    } 
} 

和測試CommonMoney

public class MoneyTest { 

    // some test cases before 

    @Test 
    public void shouldNotCreateCommonMoneyObjectWithEmptyConstructor() { 
     @SuppressWarnings("unused") 
     Money money = new CommonMoney(); 
     fail(); 
    } 
} 

現在測試用例shouldNotCreateCommonMoneyObjectWithEmptyConstructor是紅色MoneyTest類,但它如果CommonMoney的構造函數是私有的,應該是綠色的,如果是公共的,則應該是綠色的。是否有可能做出這樣的測試用例?我該怎麼做?

+4

如果構造函數是私有的,那麼您的測試類不會編譯。 – agad

+2

你可以使用反射,但**爲什麼?**你不相信你正在使用的人嗎?另外請注意,隨着系統的增長,實施測試很脆弱並且難以維護。 – kdgregory

+1

如果你只是想保證private構造函數永遠不會被調用(因爲什麼原因)在構造函數的主體內拋出一個檢查異常。但是,正如agad已經指出的那樣,由於類之外的構造函數不可見,你的測試甚至不會編譯。 –

回答

2

是否有可能做出這樣的測試用例?

是的,可以通過使用java反射來實現此測試,例如see this question。否則,不能從該類的外部測試私有構造函數是否存在 - 代碼將不會編譯。

但是,測試它並沒有意義。訪問修飾符真的是爲了開發人員的方便,並限制訪問範圍。可以說,範圍限制也是爲了方便。

您的測試應該覆蓋公共API並且不要看私有實現。

1

這不是你需要測試的東西。

正如Agad指出的那樣,代碼無論如何都不會編譯,因爲通過將構造函數設置爲私有的,您已經無法使用空的構造函數創建對象。

編譯器正在爲您做檢查,所以您不需要編寫特定的測試來檢查它。