Usando Condições com AssertJ Assertions
1. Visão geral
Neste tutorial, daremos uma olhada emthe AssertJ library, especialmente na definição e uso de condições para criar testes legíveis e de manutenção.
Os fundamentos do AssertJ podem ser encontradoshere.
2. Classe em teste
Vamos dar uma olhada na classe de destino contra a qual escreveremos casos de teste:
public class Member {
private String name;
private int age;
// constructors and getters
}
3. Criando condições
Podemos definir uma condição de asserção simplesmente instanciando a classeCondition com os argumentos apropriados.
The most convenient way to create a Condition is to use the constructor that takes a Predicate as a parameter. Outros construtores exigem que criemos uma subclasse e substituamos o métodomatches, que é menos prático.
Ao construir um objetoCondition, devemos especificar um argumento de tipo, que é o tipo do valor contra o qual a condição é avaliada.
Vamos declarar uma condição para o campoage de nossa classeMember:
Condition senior = new Condition<>(
m -> m.getAge() >= 60, "senior");
A variávelsenior agora faz referência a uma instânciaCondition que testa sePerson é sênior com base em seuage.
O segundo argumento para o construtor, oString“senior”, é uma breve descrição que será usada pelo próprio AssertJ para construir uma mensagem de erro amigável se a condição falhar.
Outra condição, verificar se umPerson tem oname “John”, é semelhante a:
Condition nameJohn = new Condition<>(
m -> m.getName().equalsIgnoreCase("John"),
"name John"
);
4. Casos de teste
Agora, vamos ver como usar os objetosCondition em nossa classe de teste. Suponha que as condiçõesseniorenameJohn estão disponíveis como campos em nossa classe de teste.
4.1. Afirmando Valores Escalares
O teste a seguir deve passar, pois o valor deage está acima do limite de antiguidade:
Member member = new Member("John", 65);
assertThat(member).is(senior);
Como a asserção com o métodois passa, uma asserção usandoisNot com o mesmo argumento falhará:
// assertion fails with an error message containing "not to be "
assertThat(member).isNot(senior);
Usando a variávelnameJohn, podemos escrever dois testes semelhantes:
Member member = new Member("Jane", 60);
assertThat(member).doesNotHave(nameJohn);
// assertion fails with an error message containing "to have:\n "
assertThat(member).has(nameJohn);
The is and has methods, as well as the isNot and doesNotHave methods have the same semantics. Que usamos é apenas uma questão de escolha. No entanto, é recomendável escolher aquele que torna nosso código de teste mais legível.
4.2. Declaração de coleções
As condições não funcionam apenas com valores escalares,but they can also verify the existence or non-existence of elements in a collection.. Vamos dar uma olhada em um caso de teste:
List members = new ArrayList<>();
members.add(new Member("Alice", 50));
members.add(new Member("Bob", 60));
assertThat(members).haveExactly(1, senior);
assertThat(members).doNotHave(nameJohn);
O métodohaveExactly afirma o número exato de elementos que atendem ao dadoCondition, enquanto o métododoNotHave verifica a ausência de elementos.
Os métodoshaveExactlyedoNotHave não são os únicos que trabalham com as condições de coleta. Para obter uma lista completa desses métodos, consultethe AbstractIterableAssert class na documentação da API.
4.3. Condições de Combinação
Podemos combinar várias condições usando três métodos estáticos da classeAssertions:
-
not – cria uma condição que é atendida se a condição especificada não for atendida
-
allOf – cria uma condição que é atendida apenas se todas as condições especificadas forem atendidas
-
anyOf – cria uma condição que é atendida se pelo menos uma das condições especificadas for atendida
Veja como os métodosnot eallOf podem ser usados para combinar condições:
Member john = new Member("John", 60);
Member jane = new Member("Jane", 50);
assertThat(john).is(allOf(senior, nameJohn));
assertThat(jane).is(allOf(not(nameJohn), not(senior)));
Da mesma forma, podemos fazer uso deanyOf:
Member john = new Member("John", 50);
Member jane = new Member("Jane", 60);
assertThat(john).is(anyOf(senior, nameJohn));
assertThat(jane).is(anyOf(nameJohn, senior));
5. Conclusão
Este tutorial forneceu um guia para as condições do AssertJ e como usá-las para criar asserções muito legíveis em seu código de teste.
A implementação de todos os exemplos e trechos de código pode ser encontradaover on GitHub.