Hamcrest Object Matchers
1. Visão geral
Hamcrest provides matchers for making unit test assertions simpler and more legible. Você pode começar a explorar alguns dos matchers disponíveishere.
Neste tutorial rápido, vamos nos aprofundar nos combinadores de objetos.
2. Configuração
Para obter o Hamcrest, precisamos apenasadd the following Maven dependency to our pom.xml:
org.hamcrest
java-hamcrest
2.0.0.0
test
A última versão do Hamcrest pode ser encontrada emMaven Central.
3. Matchers de objetos
Object matchers are meant to perform checks over object’s properties.
Antes de examinar os matchers, criaremos alguns beans para tornar os exemplos simples de entender.
Nosso primeiro objeto é chamadoLocation e não tem propriedades:
public class Location {}
Vamos nomear nosso segundo beanCitye adicionar a seguinte implementação a ele:
public class City extends Location {
String name;
String state;
// standard constructor, getters and setters
@Override
public String toString() {
if (this.name == null && this.state == null) {
return null;
}
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append("Name: ");
sb.append(this.name);
sb.append(", ");
sb.append("State: ");
sb.append(this.state);
sb.append("]");
return sb.toString();
}
}
Observe queCity estendeLocation. Faremos uso disso mais tarde. Agora, vamos começar com os combinadores de objetos!
3.1. hasToString
Como o nome diz, ohasToString method verifies that certain object has a toString method that returns a specific String:
@Test
public void givenACity_whenHasToString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}
Então, estamos criando umCitye verificando se seu métodotoString retorna oString que queremos. Podemos dar um passo adiante e, em vez de verificar a igualdade, verifique outras condições:
@Test
public void givenACity_whenHasToStringEqualToIgnoringCase_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString(
equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}
Como podemos ver,hasToString is overloaded and can receive both a String or a text matcher as a parameter. Então, também podemos fazer coisas como:
@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
City city = new City(null, null);
assertThat(city, hasToString(emptyOrNullString()));
}
Você pode encontrar mais informações sobre os matchers de textohere. Agora vamos passar para o próximo combinador de objeto.
3.2. typeCompatibleWith
Este matcherrepresents an is-a relationship. Aí vem nossa superclasseLocation em jogo:
@Test
public void givenACity_whenTypeCompatibleWithLocation_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}
Isso significa queCity é-aLocation,, o que é verdadeiro e este teste deve ser aprovado. Além disso, se quisermos testar o caso negativo:
@Test
public void givenACity_whenTypeNotCompatibleWithString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}
Claro, nossa classeCity não é umString.
Por fim, observe que todos os objetos Java devem passar no seguinte teste:
@Test
public void givenACity_whenTypeCompatibleWithObject_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}
Lembre-se de quethe matcher is consists of a wrapper over another matcher with the purpose of making the whole assertion more readable.
4. Conclusão
Hamcrest provides a simple and clean way of creating assertions. Há uma grande variedade de matchers que tornam a vida de cada desenvolvedor mais simples, bem como cada projeto mais legível.
E os matchers de objetos são definitivamente uma maneira direta de verificar as propriedades da classe.
Como sempre, você encontrará a implementação completa emthe GitHub project.