1. Testen mit JUnit
Voraussetzungen
JUnit und AssertJ im Klassenpfad
Veständnis für das Test-driven-Development
JUnit 5
AssertJ
Verwendete Datentypen in diesem Kapitel:
Noch mehr Aufgaben findest du im Buch: ›Captain CiaoCiao erobert Java: Das Trainingsbuch für besseres Java. 300 Java-Workshops, Aufgaben und Übungen mit kommentierten Lösungen‹
1.1. JUnit
1.1.1. Schon wieder gebrochen ⭐
Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) ist eine Bibliothek von Open-Source-Java-Komponenten, die von der Apache Software Foundation entwickelt wurde. Sie enthält Klassen und Methoden, die häufig verwendete Funktionalitäten bereitstellen, die nicht Teil des Java Standard Edition sind.
Aufgabe:
Lade commons-lang3-3.13.0-src.zip. Packe das Archiv aus. Importiere es als Maven-Projekt in die IDE.
Lasse in der IDE alle Testfälle laufen. Lasse über Maven alle Testfälle laufen, dazu kann man
mvn test
verwenden. Es kann Fehler geben, die können ignoriert werden.Bekomme über die Javadoc Fraction Javadoc eine Eindruck der Klasse Fraction.java. Überlege, wie Testfälle aussehen müssten.
Wirf einen Blick auf die Implementierung der Testklasse FractionTest.java. Welche JUnit-Techniken sind wiederzuerkennen?
1.2. AssertJ
AssertJ (https://assertj.github.io/doc/) ist eine Bibliothek für Fluent Assertions für Java. Mit AssertJ lassen sich prägnante, lesbare Tests schreiben, indem sie Assertionen auf eine intuitiv verständliche Art und Weise ausdrücken. Schlägt ein Test fehl, erzeugt AssertJ informative Fehlermeldungen.
1.2.1. Einstieg in AssertJ ⭐
Aufgabe:
Studiere die Homepage von AssertJ, um ein Gefühl für die Bibliothek zu bekommen.
Studiere die Javadoc der Klasse Assertions. Welches Muster kann man erkennen?
Studiere den Code einiger Tests, um ein Gefühl für die API zu bekommen: https://github.com/assertj/assertj-examples/tree/main/assertions-examples/src/test/java/org/assertj/examples
1.2.2. Test-first mit Geldbeträgen ⭐
Aufgabe:
Lege eine neue Klasse
com.tutego.money.MonetaryAmount
an. Sie soll einen Geldbetrag auf zwei Stellen hinter dem Komma speichern. Das Objekt ist immutable und muss thread-safe und auchSerializable
sein. Nutze folgende unvollständige, aber compilierbare Vorlage:public class MonetaryAmount { private MonetaryAmount() { } // Erzeugen von immutable MonetaryAmount-Objekten durch Fabrikmethode public static MonetaryAmount of( double value ) { return null; } // liefert den Wert public double value() { return 0; } public String toString() { return ""; } // MonetaryAmount-Objekte soll man mit equals(Object o) vergleichen können public boolean equals( Object o ) { return false; } // public MonetaryAmount add( MonetaryAmount value ) { return null; } public MonetaryAmount subtract( MonetaryAmount value ) { return null; } }
Schreibe ein kurzes Javadoc. Negative Geldbeträge darf es nicht geben und müssen über eine Ausnahme abgeblockt werden. 0 ist erlaubt. Das toString-Format: keine Tauserdertrenner, immer zwei Nachkommastellen, Dezimaltrenner immer der Punkt.
Fehlt eine Methode, die man aus Symmetriegründen immer haben sollte?
Lege eine neue Klasse
com.tutego.money.MonetaryAmountTest
für den Testfall an. Wohin kommt die Klasse? Unterstützt uns die IDE?Implementiere passende Testmethoden. Was müssen wir testen?
Implementiere alle Methoden der Klasse
MonetaryAmount
.Sind unsere Datentypen klug gewählt? Müssen wir eine Wahl korrigieren?