Hamcrest-Objekt-Matcher

1. Übersicht

Hamcrest bietet Matcher, um Aussagen zu Unit-Tests einfacher und lesbarer zu machen. Hier können Sie einige der verfügbaren Matcher erkunden.

In diesem kurzen Tutorial werden wir uns eingehender mit Objekt-Matchern befassen.

2. Setup

Um Hamcrest zu erhalten, müssen wir unserer pom.xml nur die folgende Maven-Abhängigkeit hinzufügen :

 org.hamcrest java-hamcrest 2.0.0.0 test 

Die neueste Hamcrest-Version finden Sie auf Maven Central.

3. Objekt-Matcher

Objekt-Matcher sollen die Eigenschaften des Objekts überprüfen .

Bevor wir uns die Matcher ansehen, werden wir ein paar Bohnen erstellen, um die Beispiele einfach verständlich zu machen.

Unser erstes Objekt heißt Location und hat keine Eigenschaften:

public class Location {}

Wir werden unsere zweite Bohne Namen der Stadt und die folgende Umsetzung , um es hinzuzufügen:

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(); } }

Beachten Sie, dass die Stadt erstreckt Ort . Wir werden das später nutzen. Beginnen wir jetzt mit den Objekt-Matchern!

3.1. hasToString

Wie der Name schon sagt, überprüft die hasToString- Methode, ob ein bestimmtes Objekt über eine toString- Methode verfügt, die einen bestimmten String zurückgibt :

@Test public void givenACity_whenHasToString_thenCorrect() { City city = new City("San Francisco", "CA"); assertThat(city, hasToString("[Name: San Francisco, State: CA]")); }

Wir erstellen also eine Stadt und überprüfen, ob ihre toString- Methode den gewünschten String zurückgibt . Wir können noch einen Schritt weiter gehen und anstatt auf Gleichheit zu prüfen, auf eine andere Bedingung prüfen:

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

Wie wir sehen können, ist hasToString überladen und kann sowohl einen String als auch einen Text-Matcher als Parameter empfangen . So können wir auch Dinge tun wie:

@Test public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() { City city = new City(null, null); assertThat(city, hasToString(emptyOrNullString())); }

Weitere Informationen zu Text-Matchern finden Sie hier. Gehen wir nun zum nächsten Objekt-Matcher.

3.2. typeCompatibleWith

Dieser Matcher repräsentiert eine Is -A- Beziehung . Hier kommt unsere Location Superklasse ins Spiel:

@Test public void givenACity_whenTypeCompatibleWithLocation_thenCorrect() { City city = new City("San Francisco", "CA"); assertThat(city.getClass(), is(typeCompatibleWith(Location.class))); }

Dies bedeutet, dass Stadt ein Ort ist, was wahr ist und dieser Test sollte bestehen. Auch wenn wir den negativen Fall testen wollten:

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

Natürlich ist unsere City- Klasse kein String.

Beachten Sie schließlich, dass alle Java-Objekte den folgenden Test bestehen sollten:

@Test public void givenACity_whenTypeCompatibleWithObject_thenCorrect() { City city = new City("San Francisco", "CA"); assertThat(city.getClass(), is(typeCompatibleWith(Object.class))); }

Bitte denken Sie daran , dass die Matcher ist über einen anderen Matcher mit dem Zweck, die ganze Behauptung lesbarer besteht aus einer Hülle.

4. Fazit

Hamcrest bietet eine einfache und saubere Möglichkeit, Aussagen zu erstellen. Es gibt eine Vielzahl von Matchern, die das Leben jedes Entwicklers vereinfachen und jedes Projekt besser lesbar machen.

Und Objekt-Matcher sind definitiv eine einfache Möglichkeit, Klasseneigenschaften zu überprüfen.

Wie immer finden Sie die vollständige Implementierung im GitHub-Projekt.