Die Grundlagen von JUnit 5 - Eine Vorschau

1. Überblick

JUnit ist eines der beliebtesten Frameworks zum Testen von Einheiten für Java. Daher ist es eine große Sache in der Entwicklergemeinde, wenn neue Hauptversionen erscheinen. Eine Alpha-Version von JUnit 5 wurde Anfang Februar veröffentlicht und enthält eine Reihe aufregender Neuerungen.

In diesem Artikel werden die neuen Funktionen dieser Version und die wichtigsten Unterschiede zu früheren Versionen beschrieben.

2. Abhängigkeiten und Setup

Die Installation von JUnit 5 ist ziemlich unkompliziert. Fügen Sie Ihrer pom.xml einfach die folgende Abhängigkeit hinzu:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.1.0</version>
    <scope>test</scope>
</dependency>

Momentan unterstützen jedoch keine IDEs JUnit 5, daher müssen Sie auch ein Build-Skript angeben:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.0.2</version>
        </dependency>
    </dependencies>
</plugin>

Es ist wichtig zu wissen, dass diese Version Java 8 erfordert, um zu funktionieren.

Stellen Sie beim Erstellen eines Tests sicher, dass Sie org.junit.jupiter.api.Test importieren.

3. Was gibt’s Neues

JUnit 5 versucht, die neuen Funktionen von Java 8, insbesondere die Lambda-Ausdrücke, voll zu nutzen.

3.1. Zusicherungen

Assertions wurden in org.junit.jupiter.api.Assertions verschoben und erheblich verbessert. Wie bereits erwähnt, können Sie jetzt Lambdas in Assertions verwenden:

@Test
void lambdaExpressions() {
    assertTrue(Stream.of(1, 2, 3)
      .stream()
      .mapToInt(i -> i)
      .sum() > 5, () -> "Sum should be greater than 5");
}

Obwohl das obige Beispiel trivial ist, besteht ein Vorteil der Verwendung des Lambda-Ausdrucks für die Assertion-Nachricht darin, dass diese langsam ausgewertet wird, was Zeit und Ressourcen sparen kann, wenn der Aufbau der Nachricht teuer ist.

Es ist jetzt auch möglich, Assertions mit assertAll () zu gruppieren, das alle fehlgeschlagenen Assertions innerhalb der Gruppe mit einem MultipleFailuresError meldet:

 @Test
 void groupAssertions() {
     int[]numbers = {0, 1, 2, 3, 4};
     assertAll("numbers",
         () -> assertEquals(numbers[0], 1),
         () -> assertEquals(numbers[3], 3),
         () -> assertEquals(numbers[4], 1)
     );
 }

Dies bedeutet, dass es jetzt sicherer ist, komplexere Zusicherungen vorzunehmen, da Sie in der Lage sind, den genauen Ort eines Fehlers zu bestimmen.

3.2. Annahmen

Annahmen werden verwendet, um Tests nur dann auszuführen, wenn bestimmte Bedingungen erfüllt sind.

Dies wird normalerweise für externe Bedingungen verwendet, die für den ordnungsgemäßen Ablauf des Tests erforderlich sind, die jedoch nicht direkt mit dem Testobjekt zusammenhängen.

Sie können eine Annahme mit assumeTrue () , assumeFalse () und __assumingThat () deklarieren.

@Test
void trueAssumption() {
    assumeTrue(5 > 1);
    assertEquals(5 + 2, 7);
}

@Test
void falseAssumption() {
    assumeFalse(5 < 1);
    assertEquals(5 + 2, 7);
}

@Test
void assumptionThat() {
    String someString = "Just a string";
    assumingThat(
        someString.equals("Just a string"),
        () -> assertEquals(2 + 2, 4)
    );
}

Wenn eine Annahme fehlschlägt, wird eine TestAbortedException ausgelöst und der Test wird einfach übersprungen.

Annahmen verstehen auch Lambda-Ausdrücke.

3.3. Ausnahmen

JUnit 5 verbessert die Unterstützung für Ausnahmen. Eine assertThrows () -Methode wurde hinzugefügt, die überprüft, ob ein Ausdruck einen Ausdruck eines bestimmten Typs auslöst:

@Test
void shouldThrowException() {
    Throwable exception = assertThrows(UnsupportedOperationException.class, () -> {
      throw new UnsupportedOperationException("Not supported");
    });
    assertEquals(exception.getMessage(), "Not supported");
}

Wie das Beispiel zeigt, bietet JUnit 5 eine bessere Kontrolle über die ausgelösten Ausnahmen als JUnit 4. Die naheliegendste Folge ist, dass jetzt leicht Informationen über die Ausnahme abgerufen werden können, wie wir es in unserem Beispiel gemacht haben, indem wir die Ausnahmemeldung durchsehen.

3.4. Verschachtelte Tests

Verschachtelte Tests wurden hinzugefügt, damit Entwickler komplexe Beziehungen zwischen verschiedenen Testgruppen darstellen können. Die Syntax ist ziemlich einfach - Sie müssen nur eine innere Klasse mit @Nested. kommentieren.

Die JUnit-Dokumentation bietet ein ausführliches example , das eine der möglichen Anwendungen veranschaulicht.

3.5. Tests deaktivieren

Tests können jetzt mit der Annotation @ Disabled deaktiviert werden.

@Test
@Disabled
void disabledTest() {
    assertTrue(false);
}

Dieser Test wird nicht ausgeführt. Die Annotation @ Disabled kann entweder auf einen Testfall oder eine Testmethode angewendet werden und entspricht @ Ignore aus JUnit 4.

3.6. Tagging

Tags sind der Ersatz für Categories aus JUnit 4. Tags können mit der Annotation @ Tag angewendet werden. Damit können Entwickler Tests gruppieren und filtern.

@Tag("Test case")
public class TaggedTest {

    @Test
    @Tag("Method")
    void testMethod() {
        assertEquals(2+2, 4);
    }
}

4. Fazit

Der Bericht war ein kurzer Überblick über die Änderungen, die mit JUnit 5 einhergehen.

Es ist wichtig anzumerken, dass zum Zeitpunkt des Schreibens nur der Alpha-Build verfügbar war, sodass sich einige Dinge vor der Veröffentlichung noch ändern können.

Die in diesem Artikel verwendeten Beispiele finden Sie im https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5 [Linked GitHub-Projekt