¿Hay una mejor manera de afirmar que un método arroja una excepción en JUnit 5?
Actualmente, tengo que usar una @Rule para verificar que mi prueba arroje una excepción, pero esto no funciona para los casos en los que espero que varios métodos arrojen excepciones en mi prueba.
java
junit
junit5
junit-jupiter
steventrouble
fuente
fuente
Respuestas:
Puede usar
assertThrows()
, lo que le permite probar múltiples excepciones dentro de la misma prueba. Con soporte para lambdas en Java 8, esta es la forma canónica de probar excepciones en JUnit.Según los documentos de JUnit :
fuente
() ->
apunta a una expresión lambda que acepta cero argumentos. Por lo tanto, el "código de producción" que se espera que arroje la excepción está en el bloque de código señalado (es decir, lathrow new...
declaración dentro de las llaves).En Java 8 y JUnit 5 (Júpiter) podemos afirmar excepciones de la siguiente manera. Utilizando
org.junit.jupiter.api.Assertions.assertThrows
Ese enfoque utilizará la interfaz funcional
Executable
enorg.junit.jupiter.api
.Referir:
fuente
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Lo han cambiado en JUnit 5 (esperado: InvalidArgumentException, real: método invocado) y el código se ve así:
fuente
Ahora Junit5 proporciona una forma de hacer valer las excepciones.
Puede probar tanto las excepciones generales como las personalizadas.
Un escenario de excepción general:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Puede encontrar una muestra para probar CustomException aquí: afirmar una muestra de código de excepción
ExpectCustomException.java
ExpectCustomExceptionTest.java
fuente
Creo que este es un ejemplo aún más simple
Llamar
get()
a un opcional que contiene un vacíoArrayList
arrojará unNoSuchElementException
.assertThrows
declara la excepción esperada y proporciona un proveedor lambda (no toma argumentos y devuelve un valor).Gracias a @prime por su respuesta, que espero haber explicado.
fuente
assertThrows
devuelve la excepción lanzada. Entonces puede hacer loNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
siguiente, a continuación puede hacer cualquier tipo de aserciones sobre el objeto de excepción que desee.Puedes usar
assertThrows()
. Mi ejemplo está tomado de los documentos http://junit.org/junit5/docs/current/user-guide/fuente
Un forro aún más simple. No se requieren expresiones lambda o llaves para este ejemplo usando Java 8 y JUnit 5
fuente
En realidad, creo que hay un error en la documentación de este ejemplo en particular. El método que se pretende es esperar.
fuente
Aquí hay una manera fácil.
Solo tiene éxito cuando se lanza la excepción que espera.
fuente