AssertJ Exception Assertions
1. Visão geral
Neste tutorial rápido, veremosAssertJ’s asserções dedicadas à exceção.
2. Sem AssertJ
Para testar se uma exceção foi lançada, precisaríamos capturar a exceção e, em seguida, executar asserções:
try {
// ...
} catch (Exception e) {
// assertions
}
Mas, e se uma exceção não for lançada? Nesse caso, o teste seria aprovado; é por isso que é necessário reprovar os casos de teste manualmente.
3. Com AssertJ
Usando o Java 8, podemos fazer asserções sobre exceções facilmente, aproveitando as expressões AssertJ e lambda.
3.1. UsandoassertThatThrownBy()
Vamos verificar se a indexação de um item fora dos limites em uma lista aumenta umIndexOutOfBoundsException:
assertThatThrownBy(() -> {
List list = Arrays.asList("String one", "String two"));
list(2);
}).isInstanceOf(IndexOutOfBoundsException.class)
.hasMessageContaining("Index: 2, Size: 2");
Observe como o fragmento de código que pode lançar uma exceção é passado como uma expressão lambda.
Obviamente, podemos aproveitar várias asserções padrão do AssertJ aqui, como:
.hasMessage("Index: %s, Size: %s", 2, 2)
.hasMessageStartingWith("Index: 2")
.hasMessageContaining("2")
.hasMessageEndingWith("Size: 2")
.hasMessageMatching("Index: \\d+, Size: \\d+")
.hasCauseInstanceOf(IOException.class)
.hasStackTraceContaining("java.io.IOException");
3.2. UsandoassertThatExceptionOfType
A ideia é semelhante ao exemplo acima, mas podemos especificar o tipo de exceção no início:
assertThatExceptionOfType(IndexOutOfBoundsException.class)
.isThrownBy(() -> {
// ...
}).hasMessageMatching("Index: \\d+, Size: \\d+");
3.3. UsandoassertThatIOExceptione outros tipos comuns
AssertJ fornece wrappers para tipos de exceção comuns como:
assertThatIOException().isThrownBy(() -> {
// ...
});
E da mesma forma:
-
assertThatIllegalArgumentException ()
-
assertThatIllegalStateException ()
-
assertThatIOException ()
-
assertThatNullPointerException ()
3.4. Separando a exceção da afirmação
Uma maneira alternativa de escrever nossos testes de unidade éwriting the when and then logic in separate sections:
// when
Throwable thrown = catchThrowable(() -> {
// ...
});
// then
assertThat(thrown)
.isInstanceOf(ArithmeticException.class)
.hasMessageContaining("/ by zero");
4. Conclusão
E aí estamos nós. Neste breve artigo, discutimosdifferent ways to use AssertJ for performing assertions on exceptions.
Como sempre, o código relacionado a este artigo está disponívelover on Github.