2012-11-06 43 views
15

Tôi muốn viết bài kiểm tra cho IndexOutOfBoundsException. Hãy ghi nhớ rằng chúng ta có nghĩa vụ phải sử dụng JUnit 3.Java: Kiểm tra ngoại lệ với Junit 3

Mã của tôi:

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; 
    } 
} 

Sau khi một số nghiên cứu, tôi thấy rằng bạn có thể làm điều này với JUnit 4 sử dụng @Test(expected = IndexOutOfBoundsException.class) nhưng không có tôi đã tìm thấy nơi cách thực hiện điều này trong JUnit 3.

Làm cách nào để kiểm tra điều này bằng JUnit 3?

Trả lời

14

Về cơ bản, bạn cần phải gọi phương thức của bạn và thất bại nếu nó không ném ngoại lệ đúng - hoặc nếu nó ném bất cứ thứ gì:

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

Một giải pháp đơn giản là thêm một catch để các unittest và để cho các thử nghiệm thất bại khi ngoại lệ không được ném

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

ngoại lệ kiểm tra trong JUnit 3 sử dụng mô hình này:

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() đảm bảo bạn gặp lỗi nếu mã không ném ngoại lệ.

Tôi cũng sử dụng mẫu này trong JUnit 4 vì tôi thường muốn đảm bảo các giá trị chính xác hiển thị trong thông báo ngoại lệ và @Test không thể thực hiện điều đó.

+1

Trong JUnit 4, bạn có thể đặt ngoại lệ dự kiến ​​trong @Test nhưng bạn cũng có thể sử dụng [ExpectedExceptions] (http://kentbeck.github.com/junit/javadoc/4.10/org/junit/rules/ExpectedException.html) linh hoạt hơn và cho phép kiểm tra thư. – assylias

+0

Ah, không biết về quy tắc này. Nó được thêm vào với JUnit 4.7. –

1

Trong phương pháp thử nghiệm của bạn, hãy gọi ajouter() bên trong một try .. catch khối, đưa ra một giá trị của indice rằng nên gây ra các trường hợp ngoại lệ được ném ra, với

  • một điều khoản catch mà bắt IndexOutOfBoundsException: trong trường hợp đó trở về từ phương pháp thử nghiệm của bạn và do đó cho biết một vượt qua.
  • một giây catch khoản mà bắt Throwable: trong trường hợp đó khai báo một thất bại (gọi fail()), bởi vì các loại sai của ngoại lệ được ném
  • sau try .. catch khai báo một thất bại (gọi fail()), bởi vì không phải ngoại lệ đã bị ném.
2

Một điều bạn có thể làm là sử dụng một boolean để chạy thử nghiệm để hoàn thành và sau đó bạn có thể sử dụng khẳng định để xác nhận các ngoại lệ được ném:

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); 

Bằng cách sử dụng thử nghiệm này, thử nghiệm của bạn sẽ không bao giờ không thực hiện được và bạn có thể xác nhận rằng một loại ngoại lệ cụ thể được ném.

1

Mở rộng @ giải pháp của A-rôn với một số (tĩnh nhập khẩu) đường cú pháp cho phép bằng văn bản:

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

Testable giống như một Runnable trong đó sử dụng thử nghiệm() chữ ký ném Throwable.

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; 
    } 
} 

Bạn có thể thêm kiểm tra thông báo ngoại lệ theo yêu cầu.

Các vấn đề liên quan