JSpecify null güvenliği ile JUnit 6
JUnit 6, JSpecify @NullMarked'ı benimseyerek null sözleşmelerini doğrulama API'si genelinde açık hale getirir.
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
}
}
Açık sözleşmeler
JUnit 6 modülündeki @NullMarked, null anlambilimini doğrudan API'de belgeler — kaynak okumaya gerek kalmaz.
Derleme zamanı güvenliği
IDE'ler ve analizörler, null olmayan beklenirken null geçildiğinde uyarır; testler çalıştırılmadan önce hatalar yakalanır.
Ekosistem standardı
JSpecify, Spring, Guava ve diğerleri tarafından benimsendi — tüm yığınınızda tutarlı null anlambilimi.
JUnit 6.0'dan itibaren kullanılabilir (Ekim 2025, Java 17+ gerektirir)
JUnit 5, standartlaştırılmış null olabilirlik açıklamaları olmadan geldi; bu durum geliştiricilerin doğrulama parametrelerinin veya dönüş değerlerinin null olup olmayacağını tahmin etmesine neden oldu. JUnit 6, tüm modülü genelinde JSpecify'ı benimser: @NullMarked açıklaması varsayılan olarak tüm açıklamasız türleri null olmayan yapar ve @Nullable istisnaları işaretler. Assertions sınıfı, assertNull(@Nullable Object actual) ve fail(@Nullable String message) gibi parametreleri açıkça açıklar; böylece IDE'ler ve NullAway ile Error Prone gibi statik analizörler çalışma zamanı yerine derleme zamanında null kötüye kullanımını yakalayabilir.