Matchers voor Hamcrest-objecten

1. Overzicht

Hamcrest biedt matchers om beweringen van unit-tests eenvoudiger en leesbaarder te maken. Je kunt hier beginnen met het verkennen van enkele van de beschikbare matchers.

In deze korte tutorial gaan we dieper in op objectmatchers.

2. Installatie

Om Hamcrest te krijgen, moeten we dat gewoon doen voeg de volgende Maven-afhankelijkheid toe aan onze pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 test 

De nieuwste Hamcrest-versie is te vinden op Maven Central.

3. Objectmatchers

Objectmatchers zijn bedoeld om controles uit te voeren op de eigenschappen van objecten.

Voordat we naar de matchers kijken, zullen we een paar bonen maken om de voorbeelden eenvoudig te begrijpen.

Ons eerste object heet Plaats en heeft geen eigenschappen:

openbare leslocatie {}

We noemen onze tweede boon stad en voeg de volgende implementatie eraan toe:

openbare klasse Stad breidt Locatie {Stringnaam uit; String staat; // standard constructor, getters en setters @Override public String toString () {if (this.name == null && this.state == null) {return null; } StringBuilder sb = nieuwe StringBuilder (); sb.append ("["); sb.append ("Naam:"); sb.append (this.name); sb.append (","); sb.append ("Staat:"); sb.append (this.state); sb.append ("]"); retourneer sb.toString (); }}

Let daar op stad strekt zich uit Plaats. Daar maken we later gebruik van. Laten we nu beginnen met de objectmatchers!

3.1. hasToString

Zoals de naam al zegt, de hasToString methode verifieert dat een bepaald object een toString methode die een specifiek Draad:

@Test openbare ongeldig gegevenACity_whenHasToString_thenCorrect () {City city = new City ("San Francisco", "CA"); assertThat (city, hasToString ("[Name: San Francisco, State: CA]")); }

Dus we maken een stad en verifiëren dat het toString methode retourneert de Draad die we willen. We kunnen nog een stap verder gaan en in plaats van te controleren op gelijkheid, controleren op een andere voorwaarde:

@Test openbare ongeldig gegevenACity_whenHasToStringEqualToIgnoringCase_thenCorrect () {City city = new City ("San Francisco", "CA"); assertThat (city, hasToString (equalToIgnoringCase ("[NAME: SAN FRANCISCO, STATE: CA]"))); }

Zoals we kunnen zien, hasToString is overbelast en kan zowel een Draad of een tekstmatcher als parameter. We kunnen dus ook dingen doen als:

@Test openbare ongeldig gegevenACity_whenHasToStringEmptyOrNullString_thenCorrect () {City city = new City (null, null); assertThat (stad, hasToString (emptyOrNullString ())); }

Meer informatie over tekstmatchers vind je hier. Laten we nu naar de volgende objectovereenkomst gaan.

3.2. typeCompatibleWith

Deze matcher vertegenwoordigt een is een relatie. Hier komt onze Plaats superklasse in het spel:

@Test openbare ongeldig gegevenACity_whenTypeCompatibleWithLocation_thenCorrect () {City city = new City ("San Francisco", "CA"); assertThat (city.getClass (), is (typeCompatibleWith (Location.class))); }

Dit zegt dat stad is een Plaats, wat waar is en deze test zou moeten slagen. Ook als we het negatieve geval willen testen:

@Test openbare ongeldig gegevenACity_whenTypeNotCompatibleWithString_thenCorrect () {City city = new City ("San Francisco", "CA"); assertThat (city.getClass (), is (not (typeCompatibleWith (String.class)))); }

Natuurlijk, onze stad klasse is geen Draad.

Merk ten slotte op dat alle Java-objecten de volgende test moeten doorstaan:

@Test openbare ongeldig gegevenACity_whenTypeCompatibleWithObject_thenCorrect () {City city = new City ("San Francisco", "CA"); assertThat (city.getClass (), is (typeCompatibleWith (Object.class))); }

Onthoud dat alsjeblieft de matcher is bestaat uit een omslag over een andere matcher met als doel de hele bewering leesbaarder te maken.

4. Conclusie

Hamcrest biedt een eenvoudige en schone manier om beweringen te creëren. Er is een grote verscheidenheid aan matchers die het leven van elke ontwikkelaar eenvoudiger en elk project leesbaarder maken.

En objectmatchers zijn absoluut een eenvoudige manier om klasse-eigenschappen te controleren.

Zoals altijd vind je de volledige implementatie op het GitHub-project.