2010-10-28 12 views
9

Esta podría ser una pregunta conceptualmente estúpida, pero también podría no serlo, y dado que todavía soy estudiante, creo que no debería tener problemas para preguntar.Afirmando excepciones en Java, ¿cómo?

Imagine que tiene un método que si se le dan ciertas condiciones lanzará una NumberFormatException. Quiero escribir una prueba de unidad para ver si la excepción se está aplicando correctamente. ¿Cómo puedo conseguir esto?

P.S. Estoy usando JUnit para escribir las pruebas unitarias.

Gracias.

Respuesta

29

Como otros sugirieron, si está utilizando junit4, a continuación, puede utilizar la anotación:

@Test(expected=NumberFormatException.class);

Sin embargo, si está utilizando una versión anterior de JUnit, o si usted quiere hacer múltiples "excepción" afirmaciones en el mismo método de ensayo, entonces el lenguaje estándar es:

try { 
    formatNumber("notAnumber"); 
    fail("Expected NumberFormatException"); 
catch(NumberFormatException e) { 
    // no-op (pass) 
}
+0

Este es un buen modismo para cuando quiere probar cosas sobre la excepción, como su mensaje, no solo su existencia. – Yishai

+0

+1 - Buen punto sobre la versión anterior. – Feanor

+0

+1 - La respuesta a esta pregunta no está completa sin el segundo ejemplo. En la práctica, tengo que recurrir a este enfoque por defecto por la mayoría de las razones mencionadas. – Synesso

2

Uso @test (= espera IOException.class)

http://junit.sourceforge.net/doc/faq/faq.htm#tests_7

Esto está bien si usted tiene una excepción esperada. Una estrategia alternativa es agregar un Assert.fail() al final del método de prueba. Si no se lanza una excepción, la prueba fallará en consecuencia. p.ej.

@Test 
public void testIOExceptionThrown() {  
    ftp.write(); // will throw IOException  
    fail(); 
} 
10

Suponiendo que está utilizando JUnit 4, llame al método de la prueba de una manera que hace que se lance la excepción, y utilice la anotación JUnit

@Test(expected = NumberFormatException.class) 

Si se produce la excepción, la prueba pasará.

+1

+1 - Rápido, muchacho – duffymo

+0

@duffymo: ¡Gracias! :) – Feanor

3

You can do this:

@Test(expected=IndexOutOfBoundsException.class) 
    public void testIndexOutOfBoundsException() { 
     ArrayList emptyList = new ArrayList(); 
     Object o = emptyList.get(0); 
    } 
1

Añadir esta anotación antes de que su método de ensayo; lo hará el truco.

@Test(expected = java.lang.NumberFormatException.class) 
public void testFooMethod() { 
    // Add code that will throw a NumberFormatException 
} 
8

Si puede utilizar JUnit 4.7, se puede utilizar el ExpectedException Regla

@RunWith(JUnit4.class) 
public class FooTest { 
    @Rule 
    public ExpectedException exception = ExpectedException.none(); 

    @Test 
    public void doStuffThrowsIndexOutOfBoundsException() { 
    Foo foo = new Foo(); 

    exception.expect(IndexOutOfBoundsException.class); 
    exception.expectMessage("happened?"); 
    exception.expectMessage(startsWith("What")); 
    foo.doStuff(); 
    } 
} 

Esto es mucho mejor que @Test(expected=IndexOutOfBoundsException.class) porque la prueba fallará si IndexOutOfBoundsException es lanzado antes de foo.doStuff()

Ver this article y the ExpectedException JavaDoc para más detalles

+0

Por Profundo razonamiento y explicación Me gustaría recomendar este artículo: http://monkeyisland.pl/2010/07/26/expected-exception-in-tests/ +1 de mí. –

+0

+1 - No sabía que esto existía. –

+0

@JonathanDrapeau corrigió el enlace. ¡Gracias por hacérmelo saber! – NamshubWriter

0

Una solución que yo s no vinculado a una determinada versión JUnit es proporcionado por catch-exception que se ha hecho para superar algunas desventajas que son inherentes a los mecanismos JUnit.

Cuestiones relacionadas