Existe um projeto que eu tomei conhecimento depois de criar esta resposta que parece promissora, é uma exceção .
Como a descrição do projeto diz, ele permite que um codificador escreva em uma linha fluente de código capturando a exceção e ofereça essa exceção para a última afirmação. E você pode usar qualquer biblioteca de asserções como Hamcrest ou AssertJ .
Um exemplo rápido retirado da página inicial:
// given: an empty list
List myList = new ArrayList();
// when: we try to get the first element of the list
when(myList).get(1);
// then: we expect an IndexOutOfBoundsException
then(caughtException())
.isInstanceOf(IndexOutOfBoundsException.class)
.hasMessage("Index: 1, Size: 0")
.hasNoCause();
Como você pode ver que o código é realmente simples, você captura a exceção em uma linha específica, a then
API é um alias que usará as APIs do AssertJ (semelhante ao uso assertThat(ex).hasNoCause()...
). Em algum momento, o projeto contou com o FEST-Assert, o ancestral do AssertJ . EDIT: Parece que o projeto está distribuindo um suporte ao Java 8 Lambdas.
Atualmente, esta biblioteca possui duas deficiências:
No momento da redação deste artigo, é digno de nota que essa biblioteca é baseada no Mockito 1.x, pois cria uma simulação do objeto testado nos bastidores. Como o Mockito ainda não está atualizado, esta biblioteca não pode funcionar com classes ou métodos finais . E mesmo que fosse baseado no Mockito 2 na versão atual, isso exigiria declarar um criador de simulação global ( inline-mock-maker
), algo que pode não ser o que você deseja, pois esse criador de simulação tem desvantagens diferentes das do criador de simulação comum.
Requer ainda outra dependência de teste.
Esses problemas não se aplicarão quando a biblioteca suportar lambdas. No entanto, a funcionalidade será duplicada pelo conjunto de ferramentas AssertJ.
Levando tudo em conta, se você não quiser usar a ferramenta catch-exception, vou recomendar a boa maneira antiga do bloco try
- catch
, pelo menos até o JDK7. E para usuários do JDK 8, você pode preferir usar o AssertJ, pois oferece mais do que apenas declarar exceções.
Com uma reescrita quase completa do JUnit 5, as asserções foram aprimoradas um pouco, elas podem ser interessantes como uma maneira pronta para afirmar uma exceção adequada. Mas realmente a API de afirmação ainda é um pouco ruim, não há nada lá fora assertThrows
.
@Test
@DisplayName("throws EmptyStackException when peeked")
void throwsExceptionWhenPeeked() {
Throwable t = assertThrows(EmptyStackException.class, () -> stack.peek());
Assertions.assertEquals("...", t.getMessage());
}
Como você notou assertEquals
ainda está voltandovoid
e, como tal, não permite asserções de encadeamento como o AssertJ.
Além disso, se você se lembrar de um conflito de nome com Matcher
ou Assert
, esteja preparado para enfrentar o mesmo conflito com Assertions
.
org.mockito.Mockito.verify
com vários parâmetros para garantir que certas coisas aconteçam (como um serviço de logger foi chamado com os parâmetros corretos) antes que a exceção fosse lançada.