0Pricing
Java Academy · درس

شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest

استخدم @WebMvcTest لاختبار وحدات التحكم بمعزل، و@DataJpaTest لاختبار طبقة المستودعات

شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما هي شرائح الاختبار؟

تحمّل شرائح الاختبار الجزء المرتبط فقط من سياق Spring لطبقة محددة. وهي أسرع من @SpringBootTest الذي يحمّل كل شيء، كما أنها تعزل الطبقة قيد الاختبار.

@WebMvcTest: طبقة المتحكمات فقط

يحمّل @WebMvcTest(UserController.class) طبقة الويب فقط، بما في ذلك المتحكمات والمرشحات وإعدادات الأمان وJackson. ويجب محاكاة الخدمات والمستودعات باستخدام @MockBean.

@WebMvcTest(UserController.class)
class UserControllerTest {
    @Autowired MockMvc mockMvc;
    @MockBean UserService userService;
    @Test
    void get_user_returns_200() throws Exception {
        given(userService.findById(1L)).willReturn(new UserDto(1L, "Alice"));
        mockMvc.perform(get("/api/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("Alice"));
    }
}

إنشاء طلبات MockMvc

أنشئ الطلبات باستخدام MockMvcRequestBuilders. واضبط الرؤوس ونوع المحتوى ونص الطلب لاختبارات POST وPUT.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"Bob","email":"bob@example.com"}"""))
    .andExpect(status().isCreated())
    .andExpect(header().exists("Location"));

اختبار التحقق من الصحة في @WebMvcTest

تؤدي نصوص الطلبات غير الصالحة إلى إطلاق MethodArgumentNotValidException. تحقّق من حالة 400 ومن نص استجابة الخطأ.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"","email":"bad"}"""))
    .andExpect(status().isBadRequest())
    .andExpect(jsonPath("$.errors.name").exists());

@DataJpaTest: طبقة المستودعات فقط

يحمّل @DataJpaTest مستودعات JPA وقاعدة بيانات H2 المضمّنة وHibernate وTestEntityManager. ولا تُحمّل المكوّنات الأخرى، مثل الخدمات والويب.

@DataJpaTest
class UserRepositoryTest {
    @Autowired UserRepository repo;
    @Autowired TestEntityManager em;
    @Test
    void find_by_email() {
        em.persist(new User("Alice", "alice@example.com"));
        em.flush();
        Optional<User> found = repo.findByEmail("alice@example.com");
        assertTrue(found.isPresent());
    }
}

TestEntityManager

يغلّف TestEntityManager كائن EntityManager مع توفير طرق مساعدة هي: persist() وflush() وfind() وpersistAndFlush().

User saved = em.persistAndFlush(new User("Bob", "bob@example.com"));
assertNotNull(saved.getId());
em.clear(); // detach all to force a real DB read
User fromDb = repo.findById(saved.getId()).orElseThrow();
assertEquals("Bob", fromDb.getName());

التراجع في @DataJpaTest

يُشغَّل كل اختبار داخل معاملة يُتراجع عنها بعد انتهاء الاختبار افتراضيًا. ولا تستمر البيانات بين الاختبارات، مما يضمن عزلها من دون تنظيف يدوي.

@DataJpaTest  // each @Test is rolled back automatically
class OrderRepositoryTest {
    @Test @Transactional
    void count_orders_is_zero_by_default() {
        assertEquals(0, orderRepo.count());
    }
}

استبدال H2 بقاعدة بيانات فعلية في @DataJpaTest

استخدم @AutoConfigureTestDatabase(replace = Replace.NONE) لتشغيل @DataJpaTest على قاعدة البيانات الفعلية المضبوطة في application.properties بدلًا من H2.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
    // Uses the configured PostgreSQL, not H2
}

@JsonTest: التسلسل إلى JSON فقط

يحمّل @JsonTest إعدادات Jackson. استخدم JacksonTester للتحقق من تسلسل الكائنات وإلغاء تسلسلها كما هو متوقع.

@JsonTest
class UserDtoJsonTest {
    @Autowired JacksonTester<UserDto> json;
    @Test
    void serializes_correctly() throws Exception {
        UserDto dto = new UserDto(1L, "Alice", "alice@example.com");
        assertThat(json.write(dto)).hasJsonPathStringValue("$.email");
    }
}

@RestClientTest: طبقة عملاء REST

يختبر @RestClientTest عملاء HTTP المبنيين على RestTemplate أو WebClient. ويضبط MockRestServiceServer لمحاكاة استجابات HTTP.

@RestClientTest(WeatherClient.class)
class WeatherClientTest {
    @Autowired WeatherClient client;
    @Autowired MockRestServiceServer server;
    @Test
    void fetches_weather() {
        server.expect(requestTo("/api/weather")).andRespond(withSuccess("""{"temp":22}""", APPLICATION_JSON));
        Weather w = client.getWeather("Istanbul");
        assertEquals(22, w.getTemp());
    }
}

دمج الشرائح باستخدام @Import

تستبعد الشرائح العديد من المكوّنات تصميمًا. استخدم @Import(SomeConfig.class) لإضافة فئات إعداد محددة تحتاج إليها الشريحة.

@WebMvcTest(UserController.class)
@Import(SecurityConfig.class)  // load security for auth tests
class SecuredControllerTest { ... }

تحقق سريع

ما قاعدة البيانات الافتراضية التي يستخدمها @DataJpaTest؟

مراجعة

يختبر @WebMvcTest طبقة المتحكمات باستخدام MockMvc؛ وتحاكي الخدمات باستخدام @MockBean. ويختبر @DataJpaTest المستودعات باستخدام TestEntityManager مع التراجع التلقائي. استخدم Replace.NONE مع قاعدة بيانات فعلية. واستخدم @JsonTest للتسلسل، و@RestClientTest لعملاء HTTP.

الأسئلة الشائعة

هل درس «شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest» مجاني؟

نعم — نص درس «شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest»؟

استخدم @WebMvcTest لاختبار وحدات التحكم بمعزل، و@DataJpaTest لاختبار طبقة المستودعات تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource
  2. Mockito المتقدم: ملتقطات المعاملات والكائنات التجسسية
  3. شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest
  4. ‏Testcontainers: اختبارات تكامل مع قاعدة بيانات حقيقية
← العودة إلى Java Academy