Assert en excepciones con JUnit
En este artículo vamos a ver como controlar el assert en excepciones con JUnit dentro de nuestros test.
Si quieres ver como realizar test con Spring Boot y Junit puedes echar un ojo a este artículo.
A continuación vamos a ver la manera de hacer assert de excepciones en nuestros test con la versión 4 y 5 de JUnit.
Uso de @Test(expected = Exception) con JUnit4
Con la versión 4 de JUnit se verifica si se ha lanzado una excepción pasando a la anotación @Test la excepción que se lanza:
@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }
Con la aproximación anterior nos aseguramos que una excepción será lanzada con nuestro código pero no obtendremos más información. Si al lanzar una excepción queremos conocer más detalle de lo que ha pasado, debemos hacer uso de @Rule con la clase ExpectedException:
@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void given_a_id_without_car_when_exception_thrown_then_get_exception_with_rule() { exceptionRule.expect(CarNotFoundException.class); exceptionRule.expectMessage("Car not found with Id 1010L"); Car car = carRepository.findById(1010L); }
En el ejemplo anterior lo que hemos hecho ha sido asegurar que se lanza una excepción con un mensaje, y una clase de excepción al recuperar un car que no existe.
AssertThrows para verificar excepción con JUnit 5
Una de las novedades de JUnit 5 Jupiter, fue los assert de las excepciones que introduce el assertThrows a través de las interfaces funcionales introducidas por Java 8.
Hacemos uso de una expresión lambda para lanzar nuestro test y verificar la excepción:
@Test public void given_a_id_without_car_when_exception_thrown_then_assert_exception { Exception exception = assertThrows(CarNotFoundException.class, () -> { carRepository.findById(1010L);; }); String expectedMessage = "Car not found with Id 1010L"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }
Cuando se invoqué al metodo findById con un id 1010 se lanzará una excepción de tipo CarNotFoundException. Mediante un assertTrue aseguramos que la excepción es lanzada con un mensaje y un error en concreto.
En el ejemplo anterior hemos hecho uso de una excepción personalizada para tener un mayor control en nuestro código, cualquier excepción es susceptible de ser usada RuntimeException, Exception etc.
Conclusión de Assert en excepciones con JUnit
En este artículo sobre assert en excepciones con JUnit hemos visto la manera en que podemos hacer test sobre las excepciones en nuestro código. JUnit nos va a ayudar a realizar test sobre nuestras aplicaciones. De este modo podemos verificar el correcto funcionamiento incluso a verificar que una excepción se esta lanzando cuando algo va mal en nuestra aplicación.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!