JUnit 6 مع أمان null في JSpecify
يعتمد JUnit 6 تعليقات JSpecify @NullMarked مما يجعل عقود null صريحةً عبر واجهة التأكيدات.
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
}
}
عقود صريحة
@NullMarked على وحدة JUnit 6 يوثّق دلالات null مباشرةً في الواجهة البرمجية — لا قراءة مصدر مطلوبة.
أمان وقت الترجمة
IDEs والمحللات تُحذّر عند تمرير null حيث يُتوقع non-null مما يكشف الأخطاء قبل تشغيل الاختبارات.
معيار النظام البيئي
JSpecify تعتمده Spring و Guava وغيرهم — دلالات null متّسقة عبر مكدسك بالكامل.
متاح منذ 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).