AssertJ Exception Assertions

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.