2012-02-10 65 views
1

我正在嘗試編寫一個單元測試來驗證無​​法創建具有負值的某個對象的實例。單元測試旨在檢查特定故障,但即使預期的異常被拋出,它仍然失敗?

我的第一個測試工作正常,如預期 - 它應該通過。

我的第二個測試會按預期產生IllegalArgumentException,但是@Test(expected = IllegalArgumentException.class)不會像我期望的那樣吸收錯誤。事實上,測試似乎完全像@Test行根本沒有!

那麼我做錯了什麼?

package numbers; 
import org.junit.Test; 
import junit.framework.TestCase; 
public class TestPositiveMoney extends TestCase { 

    public void testConstructFromLong() { 
     // Works OK 
     PositiveMoney x0 = new PositiveMoney(3L); 
    } 

    @Test(expected=IllegalArgumentException.class) 
    public void testConstructInvalid() { 
     // This statement is intended to fail 
     PositiveMoney x0 = new PositiveMoney(-3L); // Illegal 
    } 

} 

FYI,第二測試產生以下TB:

java.lang.IllegalArgumentException: Negative value -3 not allowed 
    at numbers.PositiveMoney.<init>(PositiveMoney.java:48) 
    at numbers.TestPositiveMoney.testConstructInvalid(TestPositiveMoney.java:13) 
+0

你似乎是混入juint 3和4級的版本。你使用哪個跑步者? – 2012-02-10 09:28:41

回答

4
  • extends junit.framework.TestCase是一個JUnit 3技術。
  • @Test(expected=IllegalArgumentException.class)是JUnit 4中

看來您使用的是測試運行JUnit的距離3.嘗試以下操作:

  • 添加@Test你的第一個測試
  • 下降extends TestCase條款

如果沒有幫助 - 特別是如果測試不再運行 - 請檢查JUnit v ersion你正在使用。
如果您使用maven,請嘗試-X命令行切換。

+0

知道了!這解決了它。我還必須在Eclipse中使用Junit4測試運行器,並且它工作正常。謝謝。 – 2012-02-10 09:31:37

+0

任何具有'@ Test'註解的'public void'都是一個測試。 (實際需求可以更放鬆,但我還沒有找到適當的規格。) – alf 2012-02-10 09:33:26

+0

如果您使用[catch-exception](http://code.google.com),則不會遇到此類問題/ p/catch-exception /),它獨立於測試框架。 – rwitzel 2012-06-22 15:42:08

3

你使用哪個jUnit版本? 3或4? @Test anntoation僅適用於jUnit 4.

當您使用jUnit 4時,您也不需要從junit.framework.TestCase擴展您的類。

+2

或者爲你的方法命名'testFoo()'。 – yshavit 2012-02-10 09:30:22

1

@RunWith(BlockJUnit4ClassRunner.class)註釋類或者不延長TestCase