Der Zweck eines Komponententests besteht darin, die Fehler in einer Anwendung so schnell wie möglich zu identifizieren. Obwohl mehrere Kanäle Sie zum selben Ziel führen können, sollten Sie versuchen, den effizientesten Weg zu wählen.

Eine JUnit-Testsuite kann mehrere Testklassen haben, die dieselben Daten benötigen, aber Sie können Testdaten nicht wiederverwenden. In früheren Versionen von JUnit bestand ein guter Ansatz darin, eine Hilfsmethode zu erstellen und diese Methode dann jedes Mal aufzurufen, wenn eine Testklasse ihre Daten benötigte.

JUnit 5 bietet einen effizienteren Ansatz für dieses Problem: Dependency Injection (DI).

Was ist Abhängigkeitsinjektion?

DI ist ein Entwurfsmuster, bei dem ein Objekt die Abhängigkeiten eines anderen Objekts bereitstellt. Wenn Sie eine Java-Anwendung erstellen, haben Sie möglicherweise eine Klasse, die von einem Objekt abhängt, das eine andere Klasse erstellt, um ihre Funktion auszuführen.

Um ein Objekt aus einer anderen Klasse zu verwenden, müssten Sie vor der Abhängigkeitsinjektion eine neue Instanz dieses Objekts innerhalb der davon abhängigen Klasse erstellen. Wenn Sie also mehrere Klassen hätten, die von demselben Objekt abhängen, müssten Sie mehrere Instanzen davon innerhalb der abhängigen Klassen erstellen.

instagram viewer

DI ermöglicht es Ihnen, ein Objekt in einer abhängigen Klasse zu verwenden, ohne eine neue Instanz davon in dieser Klasse zu erstellen.

Abhängigkeitsinjektion in JUnit 5

Mit JUnit 5 können Sie Abhängigkeiten sowohl in Testmethoden als auch in Konstruktoren einfügen. Dies ist von Bedeutung, da die vorherigen Versionen des Frameworks keine Testmethoden oder Konstrukteure mit Parametern zuließen.

Mit JUnit 5 können Sie beliebig viele Parameter einfügen. Der einzige Haken ist, dass die ParameterResolver-API in der Lage sein muss, jeden Parameter zur Laufzeit aufzulösen. JUnit verfügt derzeit über drei integrierte Parameter-Resolver, die automatisch verwendet werden. Um einen anderen Resolver zu verwenden, müssten Sie ihn explizit registrieren, indem Sie die Annotation @ExtendWith verwenden.

Abhängigkeiten in JUnit einfügen

Dieses Beispielprogramm verwendet einen der integrierten Parameter von JUnit (den TestInfoParameterResolver), um zu demonstrieren, wie Sie eine Abhängigkeit in eine einfügen können JUnit 5-Test. Der TestInfoParameterResolver löst Objekte auf, die zur TestInfo-Schnittstelle gehören. JUnit 5 liefert also eine Instanz der TestInfo-Schnittstelle an jede Methode oder jeden Konstruktor, der sie verwendet.

importierenstatisch org.junit.jupiter.api. Behauptungen.*;
importieren org.junit.jupiter.api. Anzeigename;
importieren org.junit.jupiter.api. Prüfen;
importieren org.junit.jupiter.api. TestInfo;

KlasseInfoTestInterfaceTest{
// Injizieren eines testInfo-Objekts in den InfoTestInterfaceTest-Konstruktor
InfoTestInterfaceTest (TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}

// Injizieren eines testInfo-Objekts in Methoden
@Prüfen
LeeretestMethodenname(TestInfo TestInfo){
assertEquals("testMethodName (TestInfo)", testInfo.getDisplayName());
}

@Prüfen
@Anzeigename("Methode mit der @Anzeigename Anmerkung")
LeeretestMethodennameZwei(TestInfo TestInfo){
assertEquals("Methode, die die @Anzeigename Anmerkung", testInfo.getDisplayName());
}
}

Der obige JUnit-Test zeigt, wie ein Objekt in einen Konstruktor und zwei Methoden eingefügt wird. Der JUnit-TestInfo interface verfügt über vier Methoden, die Sie mit seinem Objekt verwenden können.

Die Methode getDisplayName() ist die nützlichste. Es gibt den Anzeigenamen der aktuellen Testmethode oder des Konstruktors zurück. Standardmäßig basiert dieser Name auf der Klasse. Aber wenn Sie verwenden die Annotation @DisplayName, gibt die Methode getDisplayName() stattdessen diesen Text zurück.

Die obige Testklasse generiert den folgenden Testbericht:

Verwenden Sie DI in @Before- und @After-Methoden

Es gibt vier weitere Arten von annotierten JUnit-Methoden, die Abhängigkeiten unterstützen. Dies sind die Annotationen @BeforeAll, @BeforeEach, @AfterAll und @AfterEach. Wie bei der @Test-Methode müssen Sie lediglich ein Objekt als Parameter an eine der Before- oder After-Methoden übergeben, und Sie können loslegen.

Die Annotationen @Before und @After sind wichtig, da sie Ihnen auch dabei helfen, effizienteren Testcode zu entwickeln. Durch die Möglichkeit, auch Abhängigkeiten in diese Methoden einzufügen, wird Ihr Testcode weiter verbessert.