2012-07-11 30 views
7

tôi có mã nơi tôi kiểm tra các trường hợp ngoại lệ trong JUnit. Tôi muốn biết những điều sau đây là một thực tế JUnit tốt?Đó là tốt hơn, ExpectedException hoặc @Test (dự kiến ​​=

Đầu tiên

@Rule 
public ExpectedException exception = ExpectedException.none(); 

@Test 
public void checkNullObject() throws CustomException { 
    exception.expect(CustomException.class); 
    MyClass myClass= null; 
    MyCustomClass.get(null); 
} 

Second

@Test(expected=CustomException.class) 
public void checkNullObject() throws CustomException { 
    MyClass myClass= null; 
    MyCustomClass.get(null);  
} 

EDIT: Xin lưu ý rằng CustomException là một ngoại lệ tùy chỉnh không được kiểm soát. (Mặc dù nó sẽ không có bất kỳ tác động nào đối với câu hỏi này).

+0

Tôi sử dụng biểu mẫu thứ hai. –

+0

Chúng tôi cũng sử dụng biểu mẫu thứ hai. – SWoeste

+1

Hoặc là bản sao của http://stackoverflow.com/questions/785618/in-java-how-can-i-validate-a-thrown-exception-with-junit hoặc chủ yếu dựa trên ý kiến ​​ – Raedwald

Trả lời

10

Tùy thuộc vào những gì bạn muốn kiểm tra ngoại lệ. Nếu tất cả các bạn đang làm là kiểm tra xem các ngoại lệ được ném, sau đó sử dụng @Test(expected=...) có lẽ là cách dễ nhất:

@Test(expected=CustomException.class) 
public void checkNullObject() throws CustomException { 
    MyClass myClass= null; 
    MyCustomClass.get(null); 
} 

Tuy nhiên, @Rule ExpectedException có rất nhiều lựa chọn, bao gồm cả kiểm tra các tin nhắn, từ javadoc :

// These tests all pass. 
public static class HasExpectedException { 
    @Rule 
    public ExpectedException thrown= ExpectedException.none(); 

    @Test 
    public void throwsNothing() { 
     // no exception expected, none thrown: passes. 
    } 

    @Test 
    public void throwsNullPointerException() { 
     thrown.expect(NullPointerException.class); 
     throw new NullPointerException(); 
    } 

    @Test 
    public void throwsNullPointerExceptionWithMessage() { 
     thrown.expect(NullPointerException.class); 
     thrown.expectMessage("happened?"); 
     thrown.expectMessage(startsWith("What")); 
     throw new NullPointerException("What happened?"); 
    } 

    @Test 
    public void throwsIllegalArgumentExceptionWithMessageAndCause() { 
     NullPointerException expectedCause = new NullPointerException(); 
     thrown.expect(IllegalArgumentException.class); 
     thrown.expectMessage("What"); 
     thrown.expectCause(is(expectedCause)); 
     throw new IllegalArgumentException("What happened?", cause); 
    } 
} 

Vì vậy, bạn có thể kiểm tra thư, nguyên nhân ban đầu của ngoại lệ. Để kiểm tra thư, bạn có thể sử dụng đối sánh, để bạn có thể kiểm tra startsWith() và tương tự.

Một lý do để sử dụng kiểu ném/nắm kiểu cũ (Junit 3) là nếu bạn có yêu cầu cụ thể. Không có nhiều trong số này, nhưng điều này có thể xảy ra:

@Test 
public void testMe() { 
    try { 
     Integer.parseInt("foobar"); 
     fail("expected Exception here"); 
    } catch (Exception e) { 
     // OK 
    } 
} 
1

Phiên bản thứ hai chắc chắn là cách tiêu chuẩn để thực hiện. Cách học cũ để làm điều đó, trước khi Junit 4 trông giống như:

try { 
    codeThatShouldThrowException(); 
    fail("should throw exception"); 
} catch (ExpectedException expected) { 
    //Expected 
} 

Đôi khi bạn có thể muốn trở lại theo cách này, ví dụ nếu bạn muốn khẳng định một cái gì đó về thông điệp trong ngoại lệ.

+0

Tôi nghĩ ngay cả khi chúng tôi muốn kiểm tra một cái gì đó về thông điệp ngoại lệ, chúng ta có thể đi với [theo cách này] (http://stackoverflow.com/questions/11413922/check-errorcode-with-rule-in-junit). Không cần sử dụng cấu trúc try -fail - catch này –

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