JUnit ErrorCollector @Rule com exemplo
Em um cenรกrio normal, sempre que vocรช identificar algum erro durante a execuรงรฃo do teste, vocรช interromperรก o teste, corrigirรก o erro e executarรก novamente o teste.
BUT JUnit tem uma abordagem um pouco diferente. Com JUnit coletor de erros, vocรช ainda poderรก continuar com a execuรงรฃo do teste mesmo depois que um problema for encontrado ou o teste falhar. O coletor de erros coleta todos os objetos de erro e os relata apenas uma vez apรณs o tรฉrmino da execuรงรฃo do teste.
Por que usar o Coletor de Erros?
Ao escrever um script de teste, vocรช deseja executar todos os testes mesmo se alguma linha de cรณdigo falhar devido a falha de rede, falha de asserรงรฃo ou qualquer outro motivo. Nessa situaรงรฃo, vocรช ainda pode continuar executando o script de teste usando um recurso especial fornecido por JUnit conhecido como โcoletor de errosโ.
Por esta, JUnit utiliza Anotaรงรฃo @Rule que รฉ usado para criar um objeto de coletor de erros. Depois que o objeto para coletor de erros for criado, vocรช poderรก adicionar facilmente todos os erros ao objeto usando o mรฉtodo addError (erro lanรงรกvel). Como vocรช sabe, isso Lanรงรกvel รฉ a superclasse de Exceรงรฃo e erro aula em Java. Quando vocรช adiciona erros desta forma, esses erros serรฃo registrados JUnit resultado do teste .
A vantagem de adicionar todos os erros em um Coletor de Erros รฉ que vocรช pode verificar todos os erros de uma sรณ vez. Alรฉm disso, se o script falhar no meio, ele ainda poderรก continuar executando-o
Observaรงรฃo: No caso de usar assert simples ou bloco try/catch, usar o mรฉtodo coletor de erros nรฃo serรก possรญvel.
Cรณdigo de amostra
Para entender melhor o coletor de erros, veja o exemplo de cรณdigo abaixo, que demonstra como criar um objeto coletor de erros e adicionar todos os erros desse objeto ร lista de erros. traco problema:
package guru99.junit;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
public class ErrorCollectorExample {
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test
public void example() {
collector.addError(new Throwable("There is an error in first line"));
collector.addError(new Throwable("There is an error in second line"));
collector.checkThat(getResults(),
not(containsString("here is an error")));
// all lines of code will execute and at the end a combined failure will
be logged in.
}
}
O que รฉ @Rule em jUnit?
JUnit fornece um tipo especial de tratamento de testes, Caso de teste ou conjunto de testes usando anotaรงรฃo @rule. Usando @rule, vocรช pode adicionar ou redefinir facilmente o comportamento do teste.
Existem vรกrias regras internas fornecidas por JUnit API que um testador pode usar, ou atรฉ mesmo vocรช pode escrever nossa prรณpria regra.
Veja a linha de cรณdigo abaixo, que mostra como usar a anotaรงรฃo @rule junto com o Error Collector:
@Rule public ErrorCollector collector= new ErrorCollector();
Exemplo usando ErrorCollector
Para entender o coletor de erros, vamos criar uma classe e uma regra para coletar todos os erros. Vocรช adicionarรก todos os erros usando addError(throwable) aqui.
Veja o cรณdigo abaixo que simplesmente cria uma regra que nada mais รฉ do que criar um โobjeto Coletor de Errosโ. Que รฉ ainda usado para adicionar todos os erros a fim de relatar o problema no final:
ErrorCollectorExample.java
package guru99.junit;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
public class ErrorCollectorExample {
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test
public void example() {
collector.addError(new Throwable("There is an error in first line"));
collector.addError(new Throwable("There is an error in second line"));
System.out.println("Hello");
try {
Assert.assertTrue("A " == "B");
} catch (Throwable t) {
collector.addError(t);
}
System.out.println("World!!!!");
}
}
TestRunner.java
Vamos adicionar a classe de teste acima em um executor de teste e executรก-la para coletar todos os erros. Veja o cรณdigo abaixo:
package guru99.junit;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(ErrorCollectorExample.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println("Result=="+result.wasSuccessful());
}
}
Saรญda:
Veja a falha trace qual tracreรบne todos os erros em um sรณ lugar:
Benefรญcios da JUnit Coletor de erros
Vocรช pode usar JUnit afirmaรงรฃo para validaรงรฃo funcional ou GUI, por exemplo
- assertEquals(String mensagem, Objeto esperado, Objeto real) que compara que dois objetos sรฃo iguais.
- Da mesma forma, assertTrue(Boolean Condition) afirma que uma condiรงรฃo รฉ verdadeira.
Usando asserรงรฃo, o teste de validaรงรฃo torna-se fรกcil. Mas uma questรฃo importante รฉ que a execuรงรฃo do teste serรก interrompida mesmo se uma รบnica asserรงรฃo falhar.
A continuidade dos testes e o tratamento da recuperaรงรฃo sรฃo cruciais para o sucesso da automaรงรฃo de testes. Error Collector รฉ a melhor maneira de lidar com esse tipo de cenรกrio.
Resumo
- O coletor de erros Junit permite que um teste continue mesmo depois que o primeiro problema for encontrado e o teste falhar no final
- O coletor de erros coleta todos os objetos de erro e reporta apenas, afinal, a execuรงรฃo do teste acabou
- A vantagem de adicionar todos os erros em um Coletor de Erros รฉ que vocรช pode verificar todos os erros de uma vez
- O coletor de erros simplesmente adiciona erros usando o mรฉtodo addError(throwable err) fornecido por ErrorCollector.java.

