Tooling Orta

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.

✕ 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
    }
}
Bu kodda bir sorun mu gördünüz? Bize bildirin.
📜

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.

Eski Yaklaşım
Açıklamasız API
Modern Yaklaşım
@NullMarked API
JDK'dan itibaren
17
Zorluk
Orta
JSpecify null güvenliği ile JUnit 6
Mevcut

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.

Paylaş 𝕏 🦋 in