Afirmar que uma exceção é lançada nas JUnit 4 e 5
1. Introdução
Neste tutorial rápido, veremos como testar se uma exceção foi lançada, usando a biblioteca JUnit.
Claro, vamos nos certificar de cobrir as versões JUnit 4 e JUnit 5.
Leitura adicional:
2. JUnit 5
JUnit 5 Jupiter assertions API apresenta o métodoassertThrows para declarar exceções.
Isso leva o tipo de exceção esperada e uma interface funcionalExecutable onde podemos passar o código em teste por meio de uma expressão lambda:
@Test
public void whenExceptionThrown_thenAssertionSucceeds() {
String test = null;
assertThrows(NullPointerException.class, () -> {
test.length();
});
}
É importante notar aqui quethis assertion is satisfied when the enclosed code throws an exception of type NullPointerException or any of its derived types.
Isso significa que se passarmosException como o tipo de exceção esperado, qualquer exceção lançada fará a asserção bem-sucedida, poisException é o supertipo para todas as exceções.
Se mudarmos o teste acima para esperar umRuntimeException,, isso também passará:
@Test
public void whenDerivedExceptionThrown_thenAssertionSucceds() {
String test = null;
assertThrows(RuntimeException.class, () -> {
test.length();
});
}
O métodoassertThrows() permite um controle mais refinado para a lógica de asserção de exceção porque podemos usá-lo __ em torno de partes específicas do código.
3. JUnit 4
Ao usar o JUnit 4, podemos simplesmenteuse the expected attribute of the @Test annotation para declarar que esperamos que uma exceção seja lançada em qualquer lugar no método de teste anotado.
Como resultado, o teste falhará se a exceção especificada não for lançada quando o teste for executado e será aprovado se for lançada:
@Test(expected = NullPointerException.class)
public void whenExceptionThrown_thenExpectationSatisfied() {
String test = null;
test.length();
}
Neste exemplo, declaramos que esperamos que nosso código de teste resulte em umNullPointerException.
Isso é o suficiente se estamos apenas interessados em afirmar que uma exceção foi lançada.
Quando precisamos verificar algumas outras propriedades da exceção, podemos usar a regraExpectedException.
Vejamos um exemplo de verificação da propriedademessage de uma exceção:
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
@Test
public void whenExceptionThrown_thenRuleIsApplied() {
exceptionRule.expect(NumberFormatException.class);
exceptionRule.expectMessage("For input string");
Integer.parseInt("1a");
}
No exemplo acima, primeiro declaramos a regraExpectedException. Então, em nosso teste, estamos afirmando que o código que tenta analisar um valorInteger resultará em umNumberFormatException com a mensagem “Para string de entrada”.
4. Conclusão
Neste artigo, focamos e abordamos a afirmação de exceções com JUnit 4 e JUnit 5.
O código-fonte completo dos exemplos está disponívelover on GitHub.