2012-07-11 24 views
7

tengo código donde puedo comprobar las excepciones en jUnit. Quiero saber cuál de las siguientes es una buena práctica jUnit?¿Qué es mejor, o ExpectedException @test (esperado =

Primera

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

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

Segunda

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

EDIT: Tenga en cuenta que CustomException es una excepción personalizada sin marcar. (Aunque no tendrá ningún impacto en esta pregunta).

+0

Utilizo el segundo formulario. –

+0

Usamos el segundo formulario también. – SWoeste

+1

O bien un duplicado de http://stackoverflow.com/questions/785618/in-java-how-can-i-validate-a-thrown-exception-with-junit o principalmente basado en opinión – Raedwald

Respuesta

10

Depende de lo que quiera verificar en la excepción. Si todo lo que está haciendo es comprobar que la excepción se produce, a continuación, utilizando @Test(expected=...) es probablemente la manera más fácil:

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

Sin embargo, el @Rule ExpectedException tiene muchas más opciones, incluido el control del mensaje, desde el 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); 
    } 
} 

Para que pueda verificar el mensaje, la causa original de la excepción. Para verificar el mensaje, puede usar los contadores, por lo que puede marcar startsWith() y similar.

Una razón para usar el estilo antiguo (Junit 3) throw/catch es si usted tiene requisitos específicos. No hay muchos de estos, pero puede suceder:

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

La segunda versión es definitivamente la manera estándar de hacerlo. La forma de la vieja escuela para hacerlo, antes de Junit 4 parecía:

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

A veces es posible que desee volver a examinar esta manera, por ejemplo, si desea hacer valer algo sobre el mensaje en la excepción.

+0

Creo que incluso si queremos verifique algo sobre el mensaje de excepción, podemos ir con [de esta manera] (http://stackoverflow.com/questions/11413922/check-errorcode-with-rule-in-junit). No es necesario usar este try -fail-catch constructo –