Tooling متوسط

يعتمد JUnit 6 تعليقات JSpecify @NullMarked مما يجعل عقود null صريحةً عبر واجهة التأكيدات.

✕ 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
    }
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
📜

عقود صريحة

@NullMarked على وحدة JUnit 6 يوثّق دلالات null مباشرةً في الواجهة البرمجية — لا قراءة مصدر مطلوبة.

🛡️

أمان وقت الترجمة

IDEs والمحللات تُحذّر عند تمرير null حيث يُتوقع non-null مما يكشف الأخطاء قبل تشغيل الاختبارات.

🌐

معيار النظام البيئي

JSpecify تعتمده Spring و Guava وغيرهم — دلالات null متّسقة عبر مكدسك بالكامل.

الأسلوب القديم
واجهة برمجية غير مُعلَّقة
الأسلوب الحديث
واجهة برمجية مُعلَّقة بـ @NullMarked
منذ JDK
17
الصعوبة
متوسط
JUnit 6 مع أمان null في JSpecify
متاح

متاح منذ JUnit 6.0 (أكتوبر 2025، يتطلب Java 17+)

شُحِن JUnit 5 دون تعليقات قابلية الإلغاء القياسية تاركاً المطوّرين يخمّنون هل معاملات التأكيدات أو القيم المُرجَعة يمكن أن تكون null. يعتمد JUnit 6 JSpecify عبر وحدته بأكملها: التعليق @NullMarked يجعل جميع الأنواع غير المُعلَّقة non-null بشكل افتراضي، و@Nullable يُعلّم الاستثناءات. تُعلّق فئة Assertions صراحةً معاملات مثل assertNull(@Nullable Object actual) وfail(@Nullable String message).

مشاركة 𝕏 🦋 in