Tooling Fortgeschritten

JUnit 6 übernimmt @NullMarked von JSpecify und macht Null-Verträge in der gesamten Assertion-API explizit.

✕ JUnit 5
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class UserServiceTest {

    // JUnit 5: no null contracts on the API
    // Can assertEquals() accept null? Check source...
    // Does fail(String) allow null message? Unknown.

    @Test
    void findUser_found() {
        // Is result nullable? API doesn't say
        User result = service.findById("u1");
        assertNotNull(result);
        assertEquals("Alice", result.name());
    }

    @Test
    void findUser_notFound() {
        // Hope this returns null, not throws...
        assertNull(service.findById("missing"));
    }
}
✓ JUnit 6
import org.junit.jupiter.api.Test;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
import static org.junit.jupiter.api.Assertions.*;

@NullMarked  // all refs non-null unless @Nullable
class UserServiceTest {

    // JUnit 6 API is @NullMarked:
    // assertNull(@Nullable Object actual)
    // assertEquals(@Nullable Object, @Nullable Object)
    // fail(@Nullable String message)

    @Test
    void findUser_found() {
        // IDE warns: findById returns @Nullable User
        @Nullable User result = service.findById("u1");
        assertNotNull(result); // narrows type to non-null
        assertEquals("Alice", result.name()); // safe
    }

    @Test
    void findUser_notFound() {
        @Nullable User result = service.findById("missing");
        assertNull(result); // IDE confirms null expectation
    }
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
📜

Explizite Verträge

@NullMarked im JUnit-6-Modul dokumentiert die Null-Semantik direkt in der API – kein Lesen des Quellcodes erforderlich.

🛡️

Sicherheit zur Kompilierzeit

IDEs und Analysatoren warnen, wenn null übergeben wird, wo Nicht-null erwartet wird, und erkennen Fehler vor dem Testlauf.

🌐

Ökosystem-Standard

JSpecify wird von Spring, Guava und anderen übernommen – konsistente Null-Semantik im gesamten Stack.

Alter Ansatz
Nicht annotierte API
Moderner Ansatz
@NullMarked-API
Seit JDK
17
Schwierigkeitsgrad
Fortgeschritten
JUnit 6 mit JSpecify-Nullsicherheit
Verfügbar

Verfügbar seit JUnit 6.0 (Oktober 2025, erfordert Java 17+)

JUnit 5 wurde ohne standardisierte Nullbarkeits-Annotationen ausgeliefert, sodass Entwickler raten mussten, ob Assertion-Parameter oder Rückgabewerte null sein könnten. JUnit 6 übernimmt JSpecify für sein gesamtes Modul: Die @NullMarked-Annotation macht alle nicht annotierten Typen standardmäßig nicht-null, und @Nullable markiert die Ausnahmen. Die Assertions-Klasse annotiert Parameter explizit wie assertNull(@Nullable Object actual) und fail(@Nullable String message), sodass IDEs und statische Analysatoren wie NullAway und Error Prone Null-Missbrauch zur Kompilierungszeit statt zur Laufzeit erkennen können.

Teilen 𝕏 🦋 in