?在寫單元測試時,如何寫異常的測試是很多人的難題。很多書建議使用如下方法進(jìn)行測試:
public void method()
{
??????throw new RuntimeException("exception message");
}
public void testException()
{
??????try
??????{
?????????method();
?????????fail();
??????}
??????catch(Exception e)
??????{
?????????assertTrue(true);/或者此處不寫
??????}
}
??????通過這種測試,可以測試方法中是否會達(dá)到期望的要求,在方法出現(xiàn)預(yù)期中的異常時是否會拋出該異常,若沒有像期望的一樣拋出異常,則單元測試會運(yùn)行到"fail();"使得單元測試不會通過。正常情況下是沒有問題的。但是有的時候方法內(nèi)部會有多個子方法拋出同一個異常(或者說拋出的多個異常都繼承于同一個異常類),因此這個時候我們必須定位到是哪個子方法拋出的異常,而通過以上方法是不能達(dá)到這個目標(biāo)的。為了達(dá)到這個目標(biāo),可以通過判斷異常中的信息來判斷是哪個子方法出錯。通常,程序員會在拋出異常時會將產(chǎn)生該異常的原因?qū)懭氘惓P畔⒅校纾簄ew Exception(message)。因此,我們只要在單元測試中能捕捉到該異常信息,往往就能定位到該異常出現(xiàn)的位置。
只需要將以上測試的catch塊中的語句改為如下語句即可:
assertTrue(e.toString().contains(exception message));