Einführung in AssertJ

Einführung in AssertJ

1. Overview

In diesem Artikel werden wirAssertJ untersuchen - eine Open-Source-Community-gesteuerte Bibliothek, die zum Schreiben fließender und umfangreicher Aussagen in Java-Tests verwendet wird.

Dieser Artikel konzentriert sich auf Tools, die im grundlegenden AssertJ-ModulAssertJ-core verfügbar sind.

2. Maven Dependencies

Um AssertJ verwenden zu können, müssen Sie den folgenden Abschnitt in Ihrepom.xml-Datei aufnehmen:


    org.assertj
    assertj-core
    3.4.1
    test

Diese Abhängigkeit deckt nur die grundlegenden Java-Zusicherungen ab. Wenn Sie erweiterte Zusicherungen verwenden möchten, müssen Sie zusätzliche Module separat hinzufügen.

Beachten Sie, dass Sie für Java 7 und frühere Versionen AssertJ Core Version 2.x.x verwenden sollten.

Neueste Versionen finden Sie inhere.

3. Einführung

AssertJ bietet eine Reihe von Klassen und Hilfsmethoden, mit denen wir leicht fließende und schöne Aussagen schreiben können für:

  • Standard Java

  • Java 8

  • Guave

  • Joda Zeit

  • Neo4J und

  • Komponenten schwenken

Eine detaillierte Liste aller Module finden Sie unterwebsitedes Projekts.

Beginnen wir mit einigen Beispielen direkt aus der Dokumentation von AssertJ:

assertThat(frodo)
  .isNotEqualTo(sauron)
  .isIn(fellowshipOfTheRing);

assertThat(frodo.getName())
  .startsWith("Fro")
  .endsWith("do")
  .isEqualToIgnoringCase("frodo");

assertThat(fellowshipOfTheRing)
  .hasSize(9)
  .contains(frodo, sam)
  .doesNotContain(sauron);

Die obigen Beispiele sind nur die Spitze des Eisbergs, geben uns jedoch einen Überblick darüber, wie das Schreiben von Behauptungen mit dieser Bibliothek aussehen könnte.

4. AssertJ in Action

In diesem Abschnitt konzentrieren wir uns darauf, AssertJ einzurichten und seine Möglichkeiten zu erkunden.

4.1. Anfangen

Mit dem JAR der Bibliothek auf einem Klassenpfad ist das Aktivieren von Zusicherungen so einfach wie das Hinzufügen eines einzelnen statischen Imports zu Ihrer Testklasse:

import static org.assertj.core.api.Assertions.*;

4.2. Behauptungen schreiben

Um eine Zusicherung zu schreiben, müssen Sie immer zunächst Ihr Objekt an die MethodeAssertions.assertThat()übergeben und anschließend die tatsächlichen Zusicherungen eingeben.

Es ist wichtig, sich daran zu erinnern, dass der folgende Code im Gegensatz zu einigen anderen Bibliotheken noch nichts bestätigt undnevereinen Test nicht besteht:

assertThat(anyRefenceOrValue);

Wenn Sie die Code-Vervollständigungsfunktionen Ihrer IDE nutzen, wird das Schreiben von AssertJ-Zusicherungen aufgrund der sehr beschreibenden Methoden unglaublich einfach. So sieht es in IntelliJ IDEA 16 aus:

IDE’s code completion features

IDE-Funktionen zur Code-Vervollständigung

 

Wie Sie sehen können, stehen Ihnen Dutzende von Kontextmethoden zur Auswahl, die nur für den TypStringverfügbar sind. Lassen Sie uns einige dieser APIs detailliert erkunden und einige spezifische Aussagen betrachten.

4.3. Object Behauptungen

Objects können auf verschiedene Arten verglichen werden, um entweder die Gleichheit zweier Objekte zu bestimmen oder um die Felder eines Objekts zu untersuchen.

Schauen wir uns zwei Möglichkeiten an, wie wir die Gleichheit zweier Objekte vergleichen können. Bei den folgenden zweiDog Objektenfido undfidosClone:

public class Dog {
    private String name;
    private Float weight;

    // standard getters and setters
}

Dog fido = new Dog("Fido", 5.25);

Dog fidosClone = new Dog("Fido", 5.25);

Wir können Gleichheit mit folgender Behauptung vergleichen:

assertThat(fido).isEqualTo(fidosClone);

Dies schlägt fehl, wennisEqualTo() Objektreferenzen vergleicht. Wenn wir stattdessen ihren Inhalt vergleichen möchten, können wirisEqualToComparingFieldByFieldRecursively()wie folgt verwenden:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido undfidosClone sind gleich, wenn ein rekursiver Feld-für-Feld-Vergleich durchgeführt wird, da jedes Feld eines Objekts mit dem Feld des anderen Objekts verglichen wird.

Es gibt viele andere Assertionsmethoden, die verschiedene Möglichkeiten zum Vergleichen und Kontrahieren von Objekten sowie zum Untersuchen und Assertieren ihrer Felder bieten. Um sie alle zu entdecken, beziehen Sie sich auf die offiziellenAbstractObjectAssertdocumentation.

4.4. Boolean Behauptungen

Es gibt einige einfache Methoden zum Testen der Wahrheit:

  • ist wahr()

  • ist falsch()

Sehen wir sie in Aktion:

assertThat("".isEmpty()).isTrue();

4.5. Iterable/Array Behauptungen

Für einIterable oder einArray gibt es mehrere Möglichkeiten, um zu behaupten, dass ihr Inhalt existiert. Eine der häufigsten Aussagen wäre zu prüfen, ob einIterable oderArray ein bestimmtes Element enthält:

List list = Arrays.asList("1", "2", "3");

assertThat(list).contains("1");

oder wenn einList nicht leer ist:

assertThat(list).isNotEmpty();

oder wenn einList mit einem bestimmten Zeichen beginnt. Zum Beispiel "1":

assertThat(list).startsWith("1");

Beachten Sie, dass Sie mehrere Zusicherungen für ein Objekt problemlos zusammenfügen können, wenn Sie mehrere Zusicherungen erstellen möchten.

Hier ist ein Beispiel für eine Zusicherung, die prüft, ob eine bereitgestellte Liste nicht leer ist, das Element "1" enthält, keine Nullen enthält und die Folgen der Elemente "2", "3" enthält:

assertThat(list)
  .isNotEmpty()
  .contains("1")
  .doesNotContainNull()
  .containsSequence("2", "3");

Natürlich gibt es für diese Typen viel mehr mögliche Aussagen. Um sie alle zu entdecken, beziehen Sie sich auf die offiziellenAbstractIterableAssertdocumentation.

4.6. Character Behauptungen

Behauptungen für Zeichentypen beinhalten meistens Vergleiche und sogar die Überprüfung, ob ein bestimmtes Zeichen aus einerUnicode-Tabelle stammt.

Hier ist ein Beispiel für eine Behauptung, die prüft, ob ein bereitgestelltes Zeichen nicht "a" ist, in einer Unicode-Tabelle enthalten ist, größer als "b" ist und Kleinbuchstaben enthält:

assertThat(someCharacter)
  .isNotEqualTo('a')
  .inUnicode()
  .isGreaterThanOrEqualTo('b')
  .isLowerCase();

Eine detaillierte Liste der Zusicherungen aller Zeichentypen finden Sie unterAbstractCharacterAssertdocumentation.

4.7. Class Behauptungen

Bei Zusicherungen für den TypClassgeht es hauptsächlich um die Überprüfung der Felder, des TypsClass, des Vorhandenseins von Anmerkungen und der Klassenendgültigkeit.

Wenn Sie behaupten möchten, dass die KlasseRunnable eine Schnittstelle ist, müssen Sie einfach schreiben:

assertThat(Runnable.class).isInterface();

oder wenn Sie überprüfen möchten, ob eine Klasse von der anderen zuweisbar ist:

assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);

Alle möglichenClass-Aussagen können inAbstractClassAssertdocumentation angezeigt werden.

4.8. File Behauptungen

Bei den Aussagen vonFilegeht es darum zu überprüfen, ob eine bestimmteFile-Instanz vorhanden ist, ein Verzeichnis oder eine Datei ist, bestimmten Inhalt hat, lesbar ist oder eine Erweiterung hat.

Hier sehen Sie ein Beispiel für eine Behauptung, die prüft, ob eine bestimmte Datei existiert, eine Datei und kein Verzeichnis ist und lesbar und beschreibbar sein kann:

 assertThat(someFile)
   .exists()
   .isFile()
   .canRead()
   .canWrite();

Alle möglichen Klassenzusicherungen können inAbstractFileAssertdocumentation angezeigt werden.

4.9. Double/Float/Integer Behauptungen

Double/Float/Integer und andereNumber Typen

Bei numerischen Zusicherungen geht es ausschließlich darum, numerische Werte innerhalb oder außerhalb eines bestimmten Offsets zu vergleichen. Wenn Sie beispielsweise überprüfen möchten, ob zwei Werte mit einer bestimmten Genauigkeit gleich sind, können Sie Folgendes tun:

assertThat(5.1).isEqualTo(5, withPrecision(1d));

Beachten Sie, dass wir die bereits importierte HilfsmethodewithPrecision(Double offset)zum Generieren vonOffset-Objekten verwenden.

Weitere Aussagen finden Sie unter AbstractDoubleAssertdocumentation.

4.10. InputStream Behauptungen

Es ist nur eineInputStream-spezifische Behauptung verfügbar:

  • hasSameContentAs (InputStream erwartet)

und in Aktion:

assertThat(given).hasSameContentAs(expected);

4.11. Map Behauptungen

Mit den Zusicherungen vonMapkönnen Sie überprüfen, ob eine Karte bestimmte Einträge, Einträge oder Schlüssel / Werte separat enthält.

Und hier sehen Sie ein Beispiel für eine Zusicherung, die prüft, ob eine bestimmte Karte nicht leer ist, den numerischen Schlüssel „2“ enthält, keinen numerischen Schlüssel „10“ enthält und den Eintrag enthält:key: 2, value: “a”:

assertThat(map)
  .isNotEmpty()
  .containsKey(2)
  .doesNotContainKeys(10)
  .contains(entry(2, "a"));

Weitere Aussagen finden Sie unterAbstractMapAssertdocumentation.

4.12. Throwable Behauptungen

Die Zusicherungen vonThrowableermöglichen beispielsweise Folgendes: Überprüfen von Ausnahmemeldungen, Stacktraces, Überprüfen oder Überprüfen, ob bereits eine Ausnahme ausgelöst wurde.

Schauen wir uns das Beispiel einer Behauptung an, die prüft, ob eine bestimmte Ausnahme ausgelöst wurde und deren Nachricht mit "c" endet:

assertThat(ex).hasNoCause().hasMessageEndingWith("c");

Weitere Zusicherungen finden Sie unter AbstractThrowableAssertdocumentation.

5. Behauptungen beschreiben

Um eine noch höhere Ausführlichkeit zu erzielen, können Sie dynamisch generierte benutzerdefinierte Beschreibungen für Ihre Behauptungen erstellen. Der Schlüssel dazu ist dieas(String description, Object… args)-Methode.

Wenn Sie Ihre Behauptung folgendermaßen definieren:

assertThat(person.getAge())
  .as("%s's age should be equal to 100", person.getName())
  .isEqualTo(100);

Folgendes erhalten Sie beim Ausführen von Tests:

[Alex's age should be equal to 100] expected:<100> but was:(34)

6. Java 8

AssertJ nutzt die funktionalen Programmierfunktionen von Java 8 voll aus. Lassen Sie uns in ein Beispiel eintauchen und es in Aktion sehen. Lassen Sie uns zuerst sehen, wie wir es in Java 7 machen:

assertThat(fellowshipOfTheRing)
  .filteredOn("race", HOBBIT)
  .containsOnly(sam, frodo, pippin, merry);

Hier filtern wir eine Sammlung über das Rennen Hobbit und in Java 8 können wir so etwas tun:

assertThat(fellowshipOfTheRing)
  .filteredOn(character -> character.getRace().equals(HOBBIT))
  .containsOnly(sam, frodo, pippin, merry);

In einem zukünftigen Artikel aus dieser Reihe werden wir die Java8-Funktionen von AssertJ untersuchen. Die obigen Beispiele wurden aus AssertJswebsite entnommen.

7. Conclusion

In diesem Artikel untersuchten wir kurz die Möglichkeiten, die AssertJ uns zusammen mit den beliebtesten Zusicherungen für die wichtigsten Java-Typen bietet.

Die Implementierung aller Beispiele und Codefragmente finden Sie inGitHub project.