Tooling Intermédiaire

JUnit 6 adopte @NullMarked de JSpecify, rendant explicites les contrats de nuls dans toute son API d'assertions.

✕ 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
    }
}
Un problème avec ce code ? Dites-le nous.
📜

Contrats explicites

@NullMarked dans le module de JUnit 6 documente la sémantique des nuls directement dans l'API — sans besoin de lire le code source.

🛡️

Sécurité à la compilation

Les IDEs et analyseurs alertent quand null est passé là où non-null est attendu, détectant les erreurs avant l'exécution des tests.

🌐

Standard de l'écosystème

JSpecify est adopté par Spring, Guava et d'autres — sémantique de nuls cohérente dans toute votre pile.

Ancienne Approche
API sans annotations
Approche Moderne
API @NullMarked
Depuis JDK
17
Difficulté
Intermédiaire
JUnit 6 avec sécurité de nuls JSpecify
Disponible

Disponible depuis JUnit 6.0 (octobre 2025, nécessite Java 17+)

JUnit 5 a été distribué sans annotations de nullabilité standardisées, laissant les développeurs deviner si les paramètres d'assertion ou les valeurs de retour pouvaient être null. JUnit 6 adopte JSpecify dans tout son module : l'annotation @NullMarked rend tous les types non annotés non-nuls par défaut, et @Nullable marque les exceptions. La classe Assertions annote explicitement les paramètres comme assertNull(@Nullable Object actual) et fail(@Nullable String message), pour que les IDEs et analyseurs statiques comme NullAway et Error Prone puissent détecter le mauvais usage de null à la compilation plutôt qu'à l'exécution.

Partager 𝕏 🦋 in