2010-10-28 76 views
9

這可能是一個概念上愚蠢的問題,但它也可能不是,因爲我仍然是一名學生,我認爲我應該沒有問題要求。在Java中聲明異常,如何?

想象一下,你有一個方法,如果給定某些條件,它會拋出一個NumberFormatException異常。我想編寫一個單元測試來查看異常是否正確地被刺穿。我怎樣才能做到這一點?

P.S.我正在使用JUnit編寫單元測試。

謝謝。

回答

29

正如其他海報建議,如果您使用的是JUnit4,那麼你可以使用註釋:

@Test(expected=NumberFormatException.class);

但是,如果你正在使用JUnit的舊版本,或者如果你想要做的多個「例外」的斷言在同樣的測試方法,那麼標準的成語是:

try { 
    formatNumber("notAnumber"); 
    fail("Expected NumberFormatException"); 
catch(NumberFormatException e) { 
    // no-op (pass) 
}
+0

這是一個很好的習慣用法,當你想測試異常的情況時,比如它的消息,而不僅僅是它的存在。 – Yishai 2010-10-28 22:02:29

+0

+1 - 關於舊版本的好處。 – Feanor 2010-10-28 22:02:55

+0

+1 - 如果沒有第二個例子,這個問題的答案就不完整。在實踐中,由於上述原因,我需要更多地默認這種方法。 – Synesso 2010-10-28 22:20:28

2

使用@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(); 
} 
10

假設你正在使用JUnit 4,調用該方法在測試中,導致它拋出異常的方式,和使用JUnit註釋

@Test(expected = NumberFormatException.class) 

如果引發異常,測試會通過。

+1

+1 - Fast,boy。 – duffymo 2010-10-28 21:59:49

+0

@duffymo:Thanks!:) – Feanor 2010-10-28 22:00:49

3

You can do this

@Test(expected=IndexOutOfBoundsException.class) 
    public void testIndexOutOfBoundsException() { 
     ArrayList emptyList = new ArrayList(); 
     Object o = emptyList.get(0); 
    } 
1

測試方法之前添加此註釋;它會做的伎倆。

@Test(expected = java.lang.NumberFormatException.class) 
public void testFooMethod() { 
    // Add code that will throw a NumberFormatException 
} 
8

如果你可以使用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的詳細信息

+0

For深入推理和解釋我想推薦這篇文章:http://monkeyisland.pl/2010/07/26/expected-exception-in-tests/ 從我+1。 – 2010-10-29 03:46:24

+0

+1 - 我不知道這存在。 – 2013-01-22 12:43:32

+0

@JonathanDrapeau修復了這個鏈接。謝謝你讓我知道! – NamshubWriter 2014-09-21 16:57:44

0

解決方案,我不受特定的JUnit版本約束,由catch-exception提供,用於克服JUnit機制固有的一些缺點。