Existe uma maneira melhor de afirmar que um método lança uma exceção no JUnit 5?
Atualmente, tenho que usar uma @Rule para verificar se meu teste lança uma exceção, mas isso não funciona nos casos em que espero que vários métodos lançem exceções no meu teste.
java
junit
junit5
junit-jupiter
steventrouble
fonte
fonte
Respostas:
Você pode usar
assertThrows()
, o que permite testar várias exceções no mesmo teste. Com suporte para lambdas no Java 8, esta é a maneira canônica de testar exceções no JUnit.De acordo com os documentos da JUnit :
fonte
() ->
aponta para uma expressão lambda que aceita zero argumentos. Portanto, o "código de produção" que deve gerar a exceção está no bloco de código apontado (isto é, athrow new...
instrução entre colchetes).No Java 8 e JUnit 5 (Jupiter), podemos afirmar exceções da seguinte maneira. Usando
org.junit.jupiter.api.Assertions.assertThrows
Essa abordagem usará a interface funcional
Executable
noorg.junit.jupiter.api
.Referir :
fonte
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Eles foram alterados no JUnit 5 (esperado: InvalidArgumentException, atual: método invocado) e o código se parece com este:
fonte
Agora o Junit5 fornece uma maneira de afirmar as exceções
Você pode testar exceções gerais e exceções personalizadas
Um cenário de exceção geral:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Você pode encontrar uma amostra para testar a CustomException aqui: afirmar amostra de código de exceção
ExpectCustomException.java
ExpectCustomExceptionTest.java
fonte
Eu acho que este é um exemplo ainda mais simples
Chamar
get()
um opcional contendo um vazioArrayList
lançará aNoSuchElementException
.assertThrows
declara a exceção esperada e fornece um fornecedor lambda (não aceita argumentos e retorna um valor).Agradeço ao @prime por sua resposta na qual espero elaborar.
fonte
assertThrows
retorna a exceção lançada. Assim, você pode fazer oNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
seguinte e fazer qualquer tipo de afirmação no objeto de exceção que deseja.Você pode usar
assertThrows()
. Meu exemplo é retirado dos documentos http://junit.org/junit5/docs/current/user-guide/fonte
Um forro ainda mais simples. Nenhuma expressão lambda ou chaveta necessária para este exemplo usando Java 8 e JUnit 5
fonte
Na verdade, acho que há um erro na documentação deste exemplo em particular. O método pretendido é expectThrows
fonte
Aqui está uma maneira fácil.
Só é bem-sucedido quando a exceção que você espera é lançada.
fonte