Tooling Intermedio

JUnit 6 adotta JSpecify @NullMarked, rendendo espliciti i contratti null nell'intera API di asserzione.

✕ 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
    }
}
Vedi un problema con questo codice? Faccelo sapere.
📜

Contratti espliciti

@NullMarked sul modulo JUnit 6 documenta la semantica null direttamente nell'API — nessuna lettura del sorgente necessaria.

🛡️

Sicurezza in fase di compilazione

IDE e analizzatori avvisano quando viene passato null dove è atteso non-null, rilevando i bug prima dell'esecuzione dei test.

🌐

Standard dell'ecosistema

JSpecify è adottato da Spring, Guava e altri — semantica null coerente nell'intero stack.

Approccio Vecchio
API non annotata
Approccio Moderno
API @NullMarked
Dal JDK
17
Difficoltà
Intermedio
JUnit 6 con sicurezza null JSpecify
Disponibile

Disponibile da JUnit 6.0 (ottobre 2025, richiede Java 17+)

JUnit 5 è stato rilasciato senza annotazioni di nullabilità standardizzate, lasciando agli sviluppatori il compito di indovinare se i parametri di asserzione o i valori di ritorno potessero essere null. JUnit 6 adotta JSpecify nell'intero modulo: l'annotazione @NullMarked rende tutti i tipi non annotati non-null per default, e @Nullable contrassegna le eccezioni. La classe Assertions annota esplicitamente i parametri come assertNull(@Nullable Object actual) e fail(@Nullable String message), così IDE e analizzatori statici possono rilevare l'uso errato del null in fase di compilazione invece che a runtime.

Condividi 𝕏 🦋 in