JUnit 6 mit JSpecify-Nullsicherheit
JUnit 6 übernimmt @NullMarked von JSpecify und macht Null-Verträge in der gesamten Assertion-API explizit.
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"));
}
}
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
}
}
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.
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.