[英]Verifying behavior when testing a method that throws an exception
最近,在一次代碼審查中,一位同事說“測試不應該有試試塊”。 他還向我指出了有關ExpectedException
信息,並且我能夠使用它來重寫我正在對異常數據執行檢查的一些測試。
但是,我遇到的情況是我不確定我是否可以消除try-catch。 我正在為一個方法編寫單元測試,該方法將拋出一個異常並執行一些我需要使用JMockit驗證的行為。 假設測試中的代碼包含類似的內容
try {
...code...
} catch (SomeException e) {
statusMessage.send("Failure", <parameters with some data>);
throw e;
}
JUnit測試目前看起來像
@Test
public void test() {
... set things up ...
try {
callTheMethod();
fail("No exception thrown");
} catch (Exception e) {
assertEquals(SomeException.class, e.getClass());
}
new Verifications() { {
statusMessage.send("Failure", <expected data>);
} }
}
我找不到擺脫try-catch的好方法。 我個人認為沒有問題,但如果我不至少試圖擺脫它,我很可能會趕上我的同事:) :) :)
fail
和assertEquals
不是必需的。 如果有一種簡單的方法告訴JUnit / JMockit簡單地忽略來自callTheMethod()
任何異常並繼續,那就沒關系 - 我可以創建另一個測試來檢查異常。
是否有一些JUnit或JMockit功能可以讓我完成我想要做的事情?
[注意:編輯清楚我正在測試的行為是對模擬對象的調用,而不是靜態方法調用。 這與問題無關。]
您的同事在一般意義上可能是正確的,使用try-catch
測試您的異常處理比使用提供的ExpectedException
實用程序更不可取。 但是,我不認為該規則適用於您的情況; 捕獲異常,以便您可以驗證其他事情是完全合理的。 沒有其他方法可以阻止傳播AFAIK的異常。
目前使用普通的JUnit,如果要在拋出斷言后驗證某些內容,則必須使用try-catch
。 使用JUnit 4.13(尚未發布),您可以使用
expectThrows(Exception.class, () -> callTheMethod());
new Verifications() { {
statusMessage.send("Failure", <expected data>);
} }
作為替代方案,您可以使用Fishbowl的ignoreException 。
ignoreException(() -> callTheMethod());
new Verifications() { {
statusMessage.send("Failure", <expected data>);
} }
完全披露:我是Fishbowl的作者。
根據API ,我會說你可以這樣做:
class AjbUnitTest
{
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void test()
{
... set things up ...
thrown.expect(SomeException.class)
callTheMethod(); / Preumably this throws SomeException
...
}
}
對於異常特定的斷言, AssertJ有一個很好的API:
@Test
public void testException() {
assertThatThrownBy(() -> { throw new Exception("error!") })
.isInstanceOf(Exception.class)
.hasMessageContaining("error");
}
基本上,您可以“收集”異常而不會中斷測試執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.