2013-10-07 50 views
-3

比方說,我有單元測試這個簡單的方法,我想:IllegalArgumentException.class預期JUnit中

public class Add { 
    public static int addTheFollowingPositiveNumberToOne(int a) { 
     if(a <= 0) { 
      throw new IllegalArgumentException(); 
     } 
     int b = 1 + a; 
     return b; 
    } 
} 

我要讓如果參數小於或等於0

肯定則拋出

JUnit的代碼看起來是這樣的:

@Test (expected = IllegalArgumentException.class) 
public void testIllegalArgumentException() { 
    int a = -1; 
    Add.addTheFollowingPositiveNumberToOne(a); 
} 

爲什麼我要在最後添加的.class?

回答

4

如果看到expected() parameter的API文檔,則需要參數類型爲Class。這就是爲什麼你通過IllegalArgumentException類的類型爲IllegalArgumentException.class

+0

太好了。謝謝! – dinky

+1

如果有幫助,請[接受答案](http://meta.stackexchange.com/a/5235/218453)。 – Jayamohan

1

當您在類名後面編寫.class時,它會引用代表給定類的Class對象。

另外,需要注意的另一個重要的事情是,

您使用ClassName.class時類的實例是不可用的。並且在類的實例可用時使用classObject.getClass()

如果你看的@Test註釋expected()docs

公共抽象的java.lang.Class預計

選擇指定預期,可拋出,引起測試方法如果該方法拋出指定類的異常,則成功。

expected需要class類型(其延伸Throwable)的參數,從而你IllegalArgumentException後得到.class

IllegalArgumentException - 擴展可投擲 .class - 給出了期望的類對象。

+0

解釋它。謝謝! – dinky

2

實際上,IllegalArgumentException是拋出的一個類,表示某個方法已通過非法或不恰當的參數。這實際上是java中的一個類,它擴展了RuntimeException。這是繼承層次結構。

java.lang.Object 
--java.lang.Throwable 
    --java.lang.Exception 
     --java.lang.RuntimeException 
     --java.lang.IllegalArgumentException 

至於爲什麼你需要指定@Test (expected = IllegalArgumentException.class),這裏是一個簡單的解釋:

@Test註釋支持兩個可選參數第一個,預計聲明一個測試方法應該拋出一個異常如果它沒有拋出異常,或者它拋出了與聲明不同的異常,則測試將失敗。例如,以下測試成功

@Test(expected=IndexOutOfBoundsException.class) public void outOfBounds() { 
     new ArrayList<Object>().get(1); 
    } 

第二個可選參數,超時,導致測試,如果它比的時鐘特定時間量(以毫秒爲單位)需要更長的失敗。下面的測試失敗:

@Test(timeout=100) public void infinity() { 
    while(true); 
} 

僅供參考檢查:

希望它能幫助。 :)

+0

非常感謝! – dinky

相關問題