Afirmar una excepción se lanza en JUnit 4 y 5

1. Introducción

En este tutorial rápido, veremos cómo probar si se lanzó una excepción usando la biblioteca JUnit.

Por supuesto, nos aseguraremos de cubrir las versiones JUnit 4 y JUnit 5.

2. JUnit 5

La API de aserciones de JUnit 5 Jupiter introduce el método assertThrows para afirmar excepciones.

Esto toma el tipo de la excepción esperada y una interfaz funcional ejecutable donde podemos pasar el código bajo prueba a través de una expresión lambda:

@Test public void whenExceptionThrown_thenAssertionSucceeds() { Exception exception = assertThrows(NumberFormatException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Si se lanza la excepción esperada , assertThrows devuelve la excepción, lo que nos permite afirmar también en el mensaje.

Además, es importante tener en cuenta que esta aserción se satisface cuando el código adjunto arroja una excepción de tipo NullPointerException o cualquiera de sus tipos derivados.

Esto significa que si pasamos Exception como el tipo de excepción esperado, cualquier excepción lanzada hará que la aserción sea exitosa ya que Exception es el supertipo para todas las excepciones.

Si cambiamos la prueba anterior para esperar una RuntimeException , esto también pasará:

@Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { Exception exception = assertThrows(RuntimeException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

El método assertThrows () permite un control más detallado para la lógica de aserción de excepciones porque podemos usaralrededor de partes específicas del código.

3. JUnit 4

Cuando usamos JUnit 4, simplemente podemos usar el atributo esperado de la anotación @Test para declarar que esperamos que se lance una excepción en cualquier lugar del método de prueba anotado.

Como resultado, cuando se ejecuta la prueba, fallará si no se lanza la excepción especificada y pasará si se lanza:

@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }

En este ejemplo, declaramos que esperamos que nuestro código de prueba dé como resultado una NullPointerException .

Esto es suficiente si solo estamos interesados ​​en afirmar que se lanza una excepción.

Cuando necesitemos verificar algunas otras propiedades de la excepción, podemos usar la regla ExpectedException .

Veamos un ejemplo de verificación de la propiedad de mensaje de una excepción:

@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void whenExceptionThrown_thenRuleIsApplied() { exceptionRule.expect(NumberFormatException.class); exceptionRule.expectMessage("For input string"); Integer.parseInt("1a"); }

En el ejemplo anterior, primero declaramos la regla ExpectedException . Luego, en nuestra prueba, estamos afirmando que el código que intenta analizar un valor Integer dará como resultado una NumberFormatException con el mensaje "Para cadena de entrada".

4. Conclusión

En este artículo, cubrimos la afirmación de excepciones con JUnit 4 y JUnit 5.

El código fuente completo de los ejemplos está disponible en GitHub.