Bedingungen mit AssertJ-Assertions verwenden

Verwenden von Bedingungen mit AssertJ-Assertionen

 

1. Überblick

In diesem Tutorial werden wir uns mitthe AssertJ library befassen, insbesondere mit dem Definieren und Verwenden von Bedingungen zum Erstellen lesbarer und wartbarer Tests.

AssertJ-Grundlagen finden Sie inhere.

2. Klasse im Test

Werfen wir einen Blick auf die Zielklasse, für die wir Testfälle schreiben:

public class Member {
    private String name;
    private int age;

    // constructors and getters
}

3. Bedingungen schaffen

Wir können eine Assertionsbedingung definieren, indem wir einfach die KlasseConditionmit geeigneten Argumenten instanziieren.

The most convenient way to create a Condition is to use the constructor that takes a Predicate as a parameter. Bei anderen Konstruktoren müssen wir eine Unterklasse erstellen und die Methodematchesüberschreiben, was weniger praktisch ist.

Beim Erstellen einesCondition-Objekts müssen wir ein Typargument angeben, das den Typ des Werts darstellt, anhand dessen die Bedingung ausgewertet wird.

Deklarieren wir eine Bedingung für das Feldageunserer KlasseMember:

Condition senior = new Condition<>(
  m -> m.getAge() >= 60, "senior");

Die Variablesenior verweist jetzt auf eine Instanz vonCondition, die anhand ihrerage prüft, ob einPerson älter ist.

Das zweite Argument für den Konstruktor,String“senior”, ist eine kurze Beschreibung, die von AssertJ selbst verwendet wird, um eine benutzerfreundliche Fehlermeldung zu erstellen, wenn die Bedingung fehlschlägt.

Eine andere Bedingung, bei der überprüft wird, ob einPerson dasname „John“ hat, sieht folgendermaßen aus:

Condition nameJohn = new Condition<>(
  m -> m.getName().equalsIgnoreCase("John"),
  "name John"
);

4. Testfälle

Lassen Sie uns nun sehen, wie Sie die Objekte vonConditionin unserer Testklasse verwenden. Angenommen, die Bedingungensenior undnameJohn sind als Felder in unserer Testklasse verfügbar.

4.1. Skalarwerte behaupten

Der folgende Test sollte bestanden werden, da der Wert vonageüber dem Dienstalter liegt:

Member member = new Member("John", 65);
assertThat(member).is(senior);

Da die Zusicherung mit der Methodeis erfolgreich ist, schlägt eine Zusicherung mitisNot mit demselben Argument fehl:

// assertion fails with an error message containing "not to be "
assertThat(member).isNot(senior);

Mit der VariablennameJohn können wir zwei ähnliche Tests schreiben:

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. Was wir verwenden, ist nur eine Frage der Wahl. Es wird jedoch empfohlen, den zu wählen, der unseren Testcode besser lesbar macht.

4.2. Sammlungen geltend machen

Bedingungen funktionieren nicht nur mit skalaren Werten,but they can also verify the existence or non-existence of elements in a collection. Schauen wir uns einen Testfall an:

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

Die MethodehaveExactly gibt die genaue Anzahl der Elemente an, die die angegebenenCondition erfüllen, während die MethodedoNotHave auf das Fehlen von Elementen prüft.

Die MethodenhaveExactly unddoNotHave sind nicht die einzigen, die mit Erfassungsbedingungen arbeiten. Eine vollständige Liste dieser Methoden finden Sie unterthe AbstractIterableAssert class in der API-Dokumentation.

4.3. Bedingungen kombinieren

Wir können verschiedene Bedingungen mit drei statischen Methoden der KlasseAssertionskombinieren:

  • not – erstellt eine Bedingung, die erfüllt ist, wenn die angegebene Bedingung nicht erfüllt ist

  • allOf – erstellt eine Bedingung, die nur erfüllt ist, wenn alle angegebenen Bedingungen erfüllt sind

  • anyOf – erstellt eine Bedingung, die erfüllt ist, wenn mindestens eine der angegebenen Bedingungen erfüllt ist

So können die Methodennot undallOf verwendet werden, um Bedingungen zu kombinieren:

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

Ebenso können wiranyOf verwenden:

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. Fazit

Dieses Lernprogramm enthält eine Anleitung zu AssertJ-Bedingungen und deren Verwendung, um in Ihrem Testcode gut lesbare Assertions zu erstellen.

Die Implementierung aller Beispiele und Codefragmente finden Sie inover on GitHub.