2012-11-06 71 views
15

我想寫一個IndexOutOfBoundsException的測試。請記住,我們都應該使用JUnit 3Java:使用Junit 3進行異常測試

我的代碼:

public boolean ajouter(int indice, T element) { 
    if (indice < 0 || indice > (maListe.size() - 1)) { 
     throw new IndexOutOfBoundsException(); 
    } else if (element != null && !maListe.contains(element)) { 
     maListe.set(indice, element); 
     return true; 
    } 
} 

經過一番研究,我發現,你可以使用@Test(expected = IndexOutOfBoundsException.class)使用JUnit 4做到這一點,但沒有我在哪裏找如何在JUnit 3中執行此操作。

如何使用JUnit 3測試此功能?

回答

14

基本上,你需要打電話給你的方法和失敗,如果它拋出異常的權利 - 或者如果它拋出別的:

try { 
    subject.ajouter(10, "foo"); 
    fail("Expected exception"); 
} catch (IndexOutOfBoundException expect) { 
    // We should get here. You may assert things about the exception, if you want. 
} 
2

一個簡單的解決方案是一個嘗試捕捉增加單元測試的,讓當JUnit 3中的異常沒有拋出

public void testAjouterFail() { 
    try { 
    ajouter(-1,null); 
    JUnit.fail(); 
    catch (IndexOutOfBoundException()) { 
    //success 
    } 
} 
31

測試異常測試失敗使用此模式:

try { 
    ... code that should throw an exception ... 

    fail("Missing exception"); 
} catch(IndexOutOfBoundsException e) { 
    assertEquals("Expected message", e.getMessage()); // Optionally make sure you get the correct message, too 
} 

fail()確保在代碼沒有拋出異常時發生錯誤。

我在JUnit 4中使用這種模式,因爲我通常要確保正確的值在異常消息中可見,並且@Test不能這樣做。

+1

在JUnit 4中,您可以在@Test中設置預期的異常,但您也可以使用[ExpectedExceptions](http://kentbeck.github.com/junit/javadoc/4.10/org/junit/rules/ExpectedException.html )更靈活,並允許檢查消息。 – assylias

+0

啊,不知道這個規則。它添加了JUnit 4.7。 –

1

在您的測試方法,調用ajouter()一個try .. catch塊內部,給人的indice一個值,應引起異常被拋出,與

  • 映入IndexOutOfBoundsException一個catch條款:在這種情況下,從你的測試方法返回,從而表明通過。
  • 第二catch條款映入Throwable:在這種情況下宣告失敗(呼叫fail()),因爲錯誤類型的異常被拋出的try
  • ... catch宣告失敗(呼叫fail()),因爲也不例外被拋出。
2

一兩件事你可以做的是使用一個布爾值來運行測試來完成,那麼你可以使用斷言驗證異常被拋出:

boolean passed = false; 
try 
{ 
    //the line that throws exception 
    //i.e. illegal argument exception 
    //if user tries to set the property to null: 
    myObject.setProperty(null); 
} 
catch (IllegalArgumentException iaex) 
{ 
    passed = true; 
} 
assertTrue("The blah blah blah exception was not thrown as expected" 
       , passed); 

通過此測試,您的測試將永遠無法執行,您可以驗證是否拋出了特定的異常類型。

1

擴展@亞倫的一些(靜態導入)的語法糖的解決方案使寫作:

expected(MyException.class, 
     new Testable() { 
      public void test() { 
      ... do thing that's supposed to throw MyException ... 
      } 
     }); 

Testable就像它使用試驗(+)簽名拋出Throwable的一個Runnable。

public class TestHelper { 
    public static void expected(Class<? extends Throwable> expectedClass, Testable testable) { 
     try { 
      testable.test(); 
      fail("Expected "+ expectedClass.getCanonicalName() +" not thrown."); 
     } catch (Throwable actual) { 
      assertEquals("Expected "+ expectedClass.getCanonicalName() +" to be thrown.", expectedClass, actual.getClass()); 
     } 
    } 

    interface Testable { 
     public void test() throws Throwable; 
    } 
} 

您可以根據需要添加對異常消息的檢查。