2012-10-25 44 views
4

假設你有一個包含這些行考慮NullPointerException作爲單元測試失敗:這是否是一個好習慣?

assertNotNull(someVal); 
assertNotEmpty(someVal); 

這顯然會檢查someVal不爲空,並填充了一些單元測試。

問題是,第一行是否必要,是否會在測試中添加任何內容?我們不應該只有第二行,如果它是空的,它會拋出一個空指針異常,它仍然表明失敗的單元測試(但不是失敗的斷言)。

這種簡單情況下的最佳做法是什麼?

回答

2

我不是assertNot()的大粉絲,更一般地測試SUT可能發生的意外事件,更別說在每次測試中除正常斷言之外還測試它們。

IMO你應該只測試你的對象的名義狀態。如果正常someVal爲空在某些情況下,然後創建一個專用的測試方法,檢查它是否在那種情況下確實是零。爲您的測試選擇一個意圖揭示名稱,如someValShouldBeNullWhen...()。爲空或其他值做同樣的事情。

通過查看測試異常消息,您可以發現意外事件發生在您的SUT上,而不是預先嚐試預測這些意外事件,並用assertNots來填充測試。

4

您不應該將NPE視爲測試失敗。你應該真正斷言不爲空,並提供一個錯誤信息,

assertNotNull(someVal, "Some descriptive message saying why value should not be null");

+1

+1描述性信息是真誠低估的。 –

4

這要看情況。假設您正在測試函數myFunc。如果myFunc在非常規情況下返回null,我認爲檢查結果是非空值和正確值是合理的,因爲它可以使測試更清晰。

如果null是例外情況,那麼檢查它就類似於在測試中捕獲RuntimeException。只是混亂你的測試,並掩蓋你的意圖。

+0

我不同意,爲返回null而不是拋出異常的方法,返回必須是顯式的。因此,該方法設計爲返回null,因此應執行空檢查。正如馬修所說,測試中的NPE不是一件好事,因爲看到失敗的人不知道它是否是代碼或測試中的錯誤。 –

+1

@JohnB顯式的,但可能沒有打算。或者它是返回null的較低級別類的結果(返回componentObject.getFunctionResult())。另外,請考慮這一點。這種推理意味着只要你在一個返回對象的函數上編寫測試,你應該assertNotNull()。你做那個? – sharakan

+0

其實是的,因爲我做了TDD,所以做的第一件事就是返回一些非空值。我明白,如果你沒有做TDD,那不會是那麼明顯,但可能還是很好的做法。也就是說,在檢查返回對象中的每個事物時,我並不總是首先檢查null。嗯。好的練習還是懶惰?有籬笆。 –

3

JUnit中的失敗與錯誤之間存在差異。失敗是預期的事情(明確地用assertXXX()fail()進行測試),並且錯誤不是,通常是異常。請參閱What's the difference between failure and error in JUnit?

如果你打電話

assertNotNull(someVal); 

那麼你說這個值不能爲空,而你專門爲測試。如果發生NullPointerException,那麼解釋錯誤的人將不知道被測代碼是否正確,或者您沒有想到所有情況。

這是一個意圖問題。正如其他人所指出的,添加解釋信息也是一個好主意。

相關問題