Awaitility für Java: Vollständige Anleitung mit Beispielen
1. Was ist Awaitility und warum wird es benötigt?
Awaitility ist eine leistungsstarke Bibliothek für Java, die eine ausdrucksstarke DSL (Domain-Specific Language) zum Schreiben asynchroner Tests bereitstellt. In der modernen Entwicklung begegnen wir ständig asynchronen Operationen: HTTP-Anfragen, Datenbankzugriffe, Nachrichtenwarteschlangen, CompletableFuture, reaktive Streams und vieles mehr. Traditionelle Ansätze wie Thread.sleep() führen zu fragilen, langsamen und unzuverlässigen Tests. Awaitility löst dieses Problem, indem es ermöglicht, Erwartungen deklarativ zu beschreiben: "Warte, aber nicht länger als 10 Sekunden, bis die Bedingung wahr ist, und überprüfe sie alle 100 Millisekunden."
Der Hauptwert der Bibliothek liegt darin, asynchrone Tests stabil, lesbar und effizient zu machen. Anstatt zu raten, wie lange eine Operation dauert, beschreiben Sie den Endzustand des Systems. Awaitility verwaltet die Wartezeit, die Prüfhäufigkeit und die Ausnahmebehandlung automatisch. Dies ist besonders wichtig beim Testen von Microservices, Integrationsszenarien und Systemen mit verteilter Architektur, bei denen die Ausführungszeiten stark variieren können.
Die Bibliothek integriert sich in alle gängigen Test-Frameworks (JUnit 4/5, TestNG, Spock) und kann sowohl in Unit- als auch in Integrationstests verwendet werden. Awaitility schreibt keine spezifischen Ansätze für Asynchronität vor – es funktioniert mit allen Mechanismen: Callbacks, Future, reaktive Streams, Event Bus usw. Die einzige Voraussetzung ist die Möglichkeit, den Systemzustand zu einem bestimmten Zeitpunkt zu überprüfen.
2. Installation
Awaitility wird über Maven Central vertrieben. Verwenden Sie den Abhängigkeitsmanager Ihres Projekts, um die Bibliothek einzubinden.
Maven (pom.xml)
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>4.2.1</version>
<scope>test</scope>
</dependency>
Gradle (build.gradle)
testImplementation 'org.awaitility:awaitility:4.2.1'
Gradle Kotlin DSL (build.gradle.kts)
testImplementation("org.awaitility:awaitility:4.2.1")
Versionsprüfung
Die neueste Version finden Sie auf MVNRepository. Zum Zeitpunkt der Erstellung dieses Artikels ist die aktuelle stabile Version 4.2.1 (kompatibel mit Java 8+).
3. Schnellstart – Minimales funktionierendes Beispiel
Betrachten wir ein einfaches Beispiel: Wir haben einen Dienst, der einen Wert asynchron aktualisiert. Wir möchten warten, bis der Wert 5 erreicht hat.
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class QuickStartTest {
@Test
public void shouldWaitForAsyncUpdate() {
// Simuliere einen asynchronen Dienst
AtomicInteger counter = new AtomicInteger(0);
// Starte einen Hintergrundthread, der den Zähler erhöht
new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(200); // Simuliere Arbeit
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
counter.incrementAndGet();
}
}).start();
// Awaitility wartet, bis counter gleich 5 ist
Awaitility.await()
.atMost(5, TimeUnit.SECONDS)
.until(() -> counter.get() == 5);
// Überprüfe das Ergebnis
assert counter.get() == 5 : "Der Zähler sollte 5 sein";
}
}
Dieser Test wird garantiert abgeschlossen
Auch in der Bibliothek
Konfiguration von PHP-Anwendungen: Bibliotheken und Werkzeuge zur Verwaltung von Einstellungen
JavaMail (Jakarta Mail) für Java: Komplettguide mit Beispielen
Swagger/OpenAPI-Generierung für Java: Die besten Bibliotheken
CLI-Framework für C++: cppcli — Erstellung von Konsolenanwendungen