2014-09-25 57 views
0

我已經從使用TestNG的類期待Exception.class

@Test (expectedExceptions = {Exception.class}) 

無處不在的代碼可能會拋出更具體的異常其他球隊繼承了一些代碼。

我的理解是,這是錯誤的,因爲我們並不期待正確的異常類型。但目前的業主說他們沒有看到這個問題。

我的理解是否正確?

+0

您應該期望實際記錄在您正在測試的方法中的「Exception」類型。此文檔是方法的簽名本身(在檢查異常的情況下)或Javadoc(如果是未檢查的異常)。所以,如果方法聲明拋出一個'Exception',這就是你在測試中應該期望的。之後,重新設計被測試的方法,聲明拋出'Exception'是一個設計缺陷。 :-)但是如果被測方法已經記錄了一個更具體的例外,那麼你是對的。期待具體的一個! – Seelenvirtuose 2014-09-25 06:11:46

+2

*但目前的老闆說他們沒有看到這個問題。*僅僅因爲他們沒有看到錯誤,並不意味着它是單元測試的最佳方法。我可以想象,如果班級行爲正常,他們*不會看到任何問題,但是如果班級開始行爲不當,那麼這種不正當行爲可能被如此廣泛的「Exception.class」網絡「隱藏」。我認爲你的直覺是正確的,99%的時間你應該使用更具體的例外。 – jedwards 2014-09-25 06:12:11

回答

0

異常是java中所有類型的異常的父類,所以基本上,如果代碼拋出任何checked或unchecked異常,測試將通過。但是編寫單元測試會更好,它會預期代碼可能拋出的特殊類型的異常。對於例如讓說你有一個方法來validateParam

public void validateParam(String param) throws SomeCustomValidationException { 
    //suppose param is null , now this code will throw NullPointerException 
    if (param.length() > 2) {throw new SomeCustomValidationException();} 
} 

,你這樣稱呼它

public void businessLogic(String param) { 
    try {validateParam(param);} 
    catch(SomeCustomValidationException e){//show error dialog to the user} 
} 

所以,雖然你的單元測試會通過,但如你預期

1

這是你的業務邏輯將無法正常工作是不好的設計,因爲它可能會掩蓋除正在測試的錯誤之外的錯誤。舉個例子,假設你的代碼在某些操作上應該拋出一個SecurityException,但由於天真的解引用而拋出了NullPointerException。當它失敗時你的測試會通過。

您應該始終使您的匹配器儘可能具體,在這種情況下,這意味着最具體的異常類適用。