Mockito lida com exceções verificadas e desmarcadas de maneira diferente, principalmente devido à maneira como o Java trata essas exceções e como o Mockito foi projetado para funcionar com assinaturas de métodos.
Exceções verificadas
- Definição: Exceções verificadas são exceções que são verificadas no horário de compilação. Eles devem ser capturados em um bloco `` Try-Catch` ou declarados na assinatura do método usando a palavra-chave 'lança' [3].
- Mockito Manipulamento: Mockito permite lançar exceções verificadas de um objeto simulado somente se a exceção for declarada na assinatura do método. Se você tentar lançar uma exceção verificada que não é declarada, o Mockito lançará uma 'MockitoException` com uma mensagem indicando que a exceção verificada é inválida para esse método [1] [2]. Por exemplo, se um método `void somemethod () lança ioexception`, você pode usar o Mockito para lançar uma 'ioException` sem problemas.
exceções não controladas
- Definição: exceções desmarcadas são exceções que não são verificadas no horário de compilação. Normalmente, são exceções ou erros de tempo de execução que indicam erros de programação [3].
- Mockito Handling: Mockito pode facilmente lidar com exceções não controladas sem restrições. Você pode usar `thenthrow ()` ou `Dothrow ()` para simular exceções desmarcadas como 'RunTimeException` ou `NullPointerException` sem precisar que elas sejam declaradas na assinatura do método [1] [2]. Isso torna simples testar o manuseio de erros para condições inesperadas.
Solução alternativa para exceções verificadas
Se você precisar lançar uma exceção verificada que não é declarada na assinatura do método, poderá usar o método `Doanswer () 'do Mockito. Este método permite definir o comportamento personalizado para um método simulado, incluindo exceções que não são declaradas na assinatura do método [4]. No entanto, essa abordagem requer mais manuseio manual e geralmente é menos direta do que usar `thenthrow ()` ou `Dothrow ()`.
Em resumo, o manuseio da Mockito sobre exceções verificadas é mais restritivo, porque adere às verificações de tempo de compilação de Java, enquanto exceções desmarcadas podem ser jogadas livremente, facilitando o uso de testes.
Citações:[1] https://blog.sammkinng.in/blogs/checked-exception-is-invalid-for-this-method
[2] https://www.toptal.com/java/a-guide-to-everyday-mockito
[3] https://rollbar.com/blog/how-to-handle-checked-unceced-exceptions-in-java/
[4] https://stackoverflow.com/questions/3762047/throw-checked-exceptions-from-mocks-with-mockito
[5] https://stackoverflow.com/questions/38852392/mockito-difference-between-thenthrowexception-class-and-thrownew-Excepti
[6] https://www.reddit.com/r/java/comments/1cct4iq/if_everyone_hates_checked_exceptions_wheres_the/
[7] https://www.janbasktraining.com/community/java/throw-checked-exceptions-from-mocks-with-mockito
[8] https://www.youtube.com/watch?v=6-gj2w2ycmi
[9] https://www.browserstack.com/guide/mockito-throw-xception