這可能是一個概念上愚蠢的問題,但它也可能不是,因爲我仍然是一名學生,我認爲我應該沒有問題要求。在Java中聲明異常,如何?
想象一下,你有一個方法,如果給定某些條件,它會拋出一個NumberFormatException異常。我想編寫一個單元測試來查看異常是否正確地被刺穿。我怎樣才能做到這一點?
P.S.我正在使用JUnit編寫單元測試。
謝謝。
這可能是一個概念上愚蠢的問題,但它也可能不是,因爲我仍然是一名學生,我認爲我應該沒有問題要求。在Java中聲明異常,如何?
想象一下,你有一個方法,如果給定某些條件,它會拋出一個NumberFormatException異常。我想編寫一個單元測試來查看異常是否正確地被刺穿。我怎樣才能做到這一點?
P.S.我正在使用JUnit編寫單元測試。
謝謝。
正如其他海報建議,如果您使用的是JUnit4,那麼你可以使用註釋:
@Test(expected=NumberFormatException.class);
但是,如果你正在使用JUnit的舊版本,或者如果你想要做的多個「例外」的斷言在同樣的測試方法,那麼標準的成語是:
try {
formatNumber("notAnumber");
fail("Expected NumberFormatException");
catch(NumberFormatException e) {
// no-op (pass)
}
使用@Test(預期= IOException.class)
http://junit.sourceforge.net/doc/faq/faq.htm#tests_7
這是好的,如果你有一個預期的例外。另一種策略是在測試方法的最後添加一個Assert.fail()。如果不引發異常,則測試將相應地失敗。例如
@Test
public void testIOExceptionThrown() {
ftp.write(); // will throw IOException
fail();
}
@Test(expected=IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
測試方法之前添加此註釋;它會做的伎倆。
@Test(expected = java.lang.NumberFormatException.class)
public void testFooMethod() {
// Add code that will throw a NumberFormatException
}
如果你可以使用JUnit 4.7,你可以使用ExpectedException
規則
@RunWith(JUnit4.class)
public class FooTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void doStuffThrowsIndexOutOfBoundsException() {
Foo foo = new Foo();
exception.expect(IndexOutOfBoundsException.class);
exception.expectMessage("happened?");
exception.expectMessage(startsWith("What"));
foo.doStuff();
}
}
這比@Test(expected=IndexOutOfBoundsException.class)
要好得多,因爲如果IndexOutOfBoundsException
之前foo.doStuff()
見this article拋出的測試將失敗和the ExpectedException JavaDoc的詳細信息
For深入推理和解釋我想推薦這篇文章:http://monkeyisland.pl/2010/07/26/expected-exception-in-tests/ 從我+1。 – 2010-10-29 03:46:24
+1 - 我不知道這存在。 – 2013-01-22 12:43:32
@JonathanDrapeau修復了這個鏈接。謝謝你讓我知道! – NamshubWriter 2014-09-21 16:57:44
解決方案,我不受特定的JUnit版本約束,由catch-exception提供,用於克服JUnit機制固有的一些缺點。
這是一個很好的習慣用法,當你想測試異常的情況時,比如它的消息,而不僅僅是它的存在。 – Yishai 2010-10-28 22:02:29
+1 - 關於舊版本的好處。 – Feanor 2010-10-28 22:02:55
+1 - 如果沒有第二個例子,這個問題的答案就不完整。在實踐中,由於上述原因,我需要更多地默認這種方法。 – Synesso 2010-10-28 22:20:28