比方說,你有這樣的單元測試方法有斷言而非異常時的最佳做法是什麼?
public Sprite spriteAt(int x, int y)
{
assert withinBorders(x, y) : "PRE: x and y should be inside the borders";
return tileAt(x, y).topSprite();
}
對戰
public Sprite spriteAt(int x, int y)
{
if (!withinBorders(x, y)) throw new InvalidArgumentException();
return tileAt(x, y).topSprite();
}
在底部的情況下,我通常有一個單元測試用例來檢查,如果有異常拋出的公共方法時無效值x和/或y如下給出:
@Test(expected = InvalidArgumentException.class)
public void SpriteAt_InvalidX_ThrowsInvalidArgumentException()
{
sut.spriteAt(-100, 0);
}
這個測試用例是爲了確保在方法中實現參數驗證邏輯。
但是,對於頂部的斷言方法,我不知道我應該做什麼。斷言不是生產代碼,我認爲這意味着我不必測試斷言。另一方面,我認爲單元測試應該在方法中發生邏輯變化時通知開發人員失敗。如果我不寫一個測試用例來檢查是否有一個檢查無效參數的斷言(就像我如何處理異常方法一樣),那麼當意外刪除斷言行代碼時,我可能沒有意識到我犯了一個錯誤。
因此,我想要做的是檢查是否斷言是在地方,如果JUnit是運行啓用斷言,並沒有啓用斷言的時候沒有做任何事情。下面的代碼將包含僞代碼。
@Test
public void SpriteAt_InvalidX_AssertionThrowsException()
{
if (assertion is enabled)
{
try
{
sut.spriteAt(-100, 0);
fail();
}
catch (AssertionFailureException e)
{
}
}
}
所以回到我的觀點。我想知道單元測試是否應該測試斷言。如果是這樣,我會朝着正確的方向前進嗎?如果不是的話,你如何防止在沒有單元測試的情況下意外刪除斷言代碼?
你能否解釋一下你的最後一句話?我也有說法是不是太重要了(除了單元測試)的感覺,但我還是大三。 – 2015-04-20 08:46:57