unitarias unitaria tutorial test pruebas prueba example español ejemplos create con java junit exception

java - tutorial - pruebas unitarias



Prueba de múltiples excepciones con anotaciones JUnit 4 (7)

¿Es posible probar múltiples excepciones en una sola prueba de unidad JUnit? Sé que por una sola excepción se puede usar, por ejemplo

@Test(expected=IllegalStateException.class)

Ahora, si quiero probar otra excepción (por ejemplo, NullPointerException), ¿se puede hacer esto en la misma anotación, una anotación diferente o necesito escribir otra prueba de unidad completamente?


¿Cómo esperas que las "esperadas" funcionen? Un método solo puede lanzar una excepción.

Tendría que escribir una prueba de unidad diferente para cada forma en que el método puede fallar. Entonces, si el método arroja legítimamente dos excepciones, entonces necesita configurar dos pruebas para forzar el método de lanzar cada excepción.


Aunque esto no es posible con JUnit 4, es posible si cambia a TestNG, que le permite escribir

@Test(expectedExceptions = {IllegalArgumentException.class, NullPointerException.class})


Esto no es posible con la anotación.

Con JUnit 4.7 puedes usar la nueva regla ExpectedException

public static class HasExpectedException { @Interceptor public ExpectedException thrown= new ExpectedException(); @Test public void throwsNothing() { } @Test public void throwsNullPointerException() { thrown.expect(NullPointerException.class); throw new NullPointerException(); } @Test public void throwsNullPointerExceptionWithMessage() { thrown.expect(NullPointerException.class); thrown.expectMessage("happened?"); throw new NullPointerException("What happened?"); } }

Más ver

Si no es posible actualizar a JUnit 4.7, tiene que escribir una prueba de unidad desnuda del formulario

public test() { try { methodCall(); // should throw Exception fail(); } catch (Exception ex) { assert((ex instanceof A) || (ex instanceof B) || ...etc...); ... }

}


Mantenga las pruebas lo más simples y cortas posible. La intención de una prueba JUnit es probar solo una funcionalidad simple o una sola forma de falla.

De hecho, para estar seguro, debe crear al menos una prueba para cada forma de ejecución posible.

Normalmente, esto no siempre es posible porque si tiene un método que analiza una cadena, hay tantas combinaciones de cadenas posibles que no puede cubrir todo.

Manténlo corto y simple.

Puede tener 30-40 métodos de prueba para un solo método fácilmente ... ¿realmente importa?

Saludos


Realmente quieres que la prueba haga una cosa, y que haga una prueba para eso. Si no está seguro de qué excepción se va a lanzar, no me parece una buena prueba.

por ejemplo (en pseudocódigo)

try { badOperation(); /// looks like we succeeded. Not good! Fail the test fail(); } catch (ExpectedException e) { // that''s fine } catch (UnexpectedException e) { // that''s NOT fine. Fail the test }

por lo tanto, si desea probar que su método arroja 2 excepciones diferentes (para 2 conjuntos de entradas), entonces necesitará 2 pruebas.


Utilice catch-exception :

// test public void testDo() { // obj.do(1) must throw either A or B catchException(obj).do(1); assert caughtException() instanceof A || caughtException() instanceof B; // obj.do(2) must throw A but not SubclassOfA catchException(obj).do(2); assert caughtException() instanceof A && !(caughtException() instanceof SubclassOfA); }


@Test(expected=Exception.class)

Esto arrojará todas las excepciones posibles.