Dastur hodisalari

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring Framework 5.3.3 versiyasidan boshlab, TestContext framework ApplicationContext ichida e'lon qilingan dastur hodisalarini yozishni qo'llab-quvvatlaydi, bu hodisalarga testlarda tasdiqlarni bajarishga imkon beradi. Bir test ishlashi davomida e'lon qilingan barcha hodisalar ApplicationEvents API interfeysi orqali mavjud bo'lib, ular java.util.Stream sifatida ishlov berilishi mumkin.

Tasdiqlarda ApplicationEvents dan foydalanish uchun quyidagi ishlarni bajaring.

  • Sizning test sinfingiz @RecordApplicationEvents yordamida anotatsiya qilingan yoki meta-anotatsiya qilinganligiga ishonch hosil qiling.

  • ApplicationEventsTestExecutionListener ro'yxatdan o'tganligiga ishonch hosil qiling. Qayd eting, ApplicationEventsTestExecutionListener odatiy holda ro'yxatdan o'tkaziladi, va agar sizda @TestExecutionListeners annotatsiyasi orqali maxsus konfiguratsiya mavjud bo'lsa, uni qo'lda ro'yxatdan o'tkazish kerak, bu odatiy tinglovchilarni o'z ichiga olmaydi.

  • ApplicationEvents turidagi maydonni @Autowired annotatsiyasi bilan annotatsiya qiling va ushbu ApplicationEvents namunadan test usullari va hayot tsikli usullarida (masalan, JUnit Jupiter da @BeforeEach va @AfterEach annotatsiyalari bilan belgilangan usullarda) foydalaning.

    • JUnit Jupiter uchun SpringExtension kengaytmasidan foydalanganda, test usulida yoki test klassidagi @Autowired bilan anotatsiya qilingan maydon o'rniga hayot tsikli usulida ApplicationEvents turidagi parametrni e'lon qilishingiz mumkin.

Quyidagi test sinfi JUnit Jupiter uchun SpringExtension va AssertJ ni Spring tomonidan boshqariladigan komponentda usulni chaqirganda e'lon qilingan dastur hodisalari turlarini tasdiqlash uchun foydalanadi:

Java
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents 
class OrderServiceTests {
    @Autowired
    OrderService orderService;
    @Autowired
    ApplicationEvents events; 
    @Test
    void submitOrder() {
        // OrderService'da hodisani e'lon qiluvchi usulni chaqiramiz
        orderService.submitOrder(new Order(/* ... */));
        // OrderSubmitted hodisasi e'lon qilinganligiga ishonch hosil qilamiz
        long numEvents = events.stream(OrderSubmitted.class).count(); 
        assertThat(numEvents).isEqualTo(1);
    }
}
  1. Test sinfini @RecordApplicationEvents yordamida annotatsiya qilamiz.
  2. Joriy test uchun ApplicationEvents namunani kiritamiz.
  3. OrderSubmitted hodisalar qancha e'lon qilinganligini hisoblash uchun ApplicationEvents API interfeysidan foydalanamiz.
Kotlin
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents 
class OrderServiceTests {
    @Autowired
    lateinit var orderService: OrderService
    @Autowired
    lateinit var events: ApplicationEvents 
    @Test
    fun submitOrder() {
        // OrderService'da hodisani e'lon qiluvchi usulni chaqiramiz
        orderService.submitOrder(Order(/* ... */))
        // OrderSubmitted hodisasi e'lon qilinganligini tasdiqlaymiz
        val numEvents = events.stream(OrderSubmitted::class).count() 
        assertThat(numEvents).isEqualTo(1)
    }
}
  1. Test sinfini @RecordApplicationEvents yordamida annotatsiya qilamiz.
  2. Joriy test uchun ApplicationEvents namunani kiritamiz.
  3. OrderSubmitted hodisalar qancha e'lon qilinganligini hisoblash uchun ApplicationEvents API interfeysidan foydalanamiz.

API interfeysi ApplicationEvents bo'yicha qo'shimcha ma'lumot uchun javadoc ga qarang: ApplicationEvents .

Test ijrosi hodisalari

Spring Framework 5.2 da taqdim etilgan EventPublishingTestExecutionListener maxsus TestExecutionListener ni amalga oshirishga alternativa yondashuvni taklif etadi. Test ApplicationContext'idagi komponentlar quyidagi EventPublishingTestExecutionListener tomonidan e'lon qilingan hodisalarni tinglashi mumkin, ularning har biri TestExecutionListener API interfeysidagi usulga mos keladi.

  • BeforeTestClassEvent

  • PrepareTestInstanceEvent

  • BeforeTestMethodEvent

  • BeforeTestExecutionEvent

  • AfterTestExecutionEvent

  • AfterTestMethodEvent

  • AfterTestClassEvent

Bu hodisalar turli sabablar uchun iste'mol qilinishi mumkin, masalan, mok sinflarni yana sozlash yoki testlarning bajarilishini kuzatish uchun. Maxsus TestExecutionListener ni amalga oshirish o'rniga test ijrosi hodisalarini iste'mol qilishning afzalliklaridan biri shundaki, test ijrosi hodisalari test ApplicationContext'da ro'yxatdan o'tgan har qanday Spring beani tomonidan iste'mol qilinishi mumkin va bunday sinflar ApplicationContext'ning dependentsiyani kiritish va boshqa funksiyalaridan bevosita foydalanishlari mumkin. Buning aksiga TestExecutionListener ApplicationContext'dagi bean emas.

EventPublishingTestExecutionListener odatiy sifatida ro'yxatdan o'tkaziladi; ammo, u hodisalarni faqat ApplicationContext allaqachon yuklangan bo'lsa e'lon qiladi. Bu ApplicationContext'ni keraksiz yoki juda erta yuklanishdan saqlaydi.

Shu sababli, BeforeTestClassEvent hodisasi faqat ApplicationContext boshqa TestExecutionListener tomonidan yuklanganidan keyin e'lon qilinadi. Masalan, odatiy holda ro'yxatdan o'tgan TestExecutionListener ni amalga oshirish to'plami bo'lsa, ma'lum test uchun ApplicationContext ishlatadigan birinchi test sinfi uchun BeforeTestClassEvent hodisasi e'lon qilinmaydi, lekin shu test to'plamida keyinroq ApplicationContext'ning bir xil test ApplicationContext'ni foydalanadigan har qanday keyingi test sinfi uchun BeforeTestClassEvent hodisasi e'lon qilinadi, chunki ContextCache dan konteksni olib tashlash kabi @DirtiesContext annotatsiyasi orqali yoki maksimal hajmga erishish siyosati orqali konteksni olib tashlamaganda, keyingi test sinflarini bajarishda konteks allaqachon yuklangan bo'ladi.

Agar BeforeTestClassEvent hodisasi har bir test sinfi uchun har doim e'lon qilinishini xohlasangiz, unda beforeTestClass qaytish chaqiruv funksiyasida ApplicationContext'ni yuklaydigan TestExecutionListener'ni ro'yxatdan o'tkazishingiz kerak, va bu TestExecutionListener oldin EventPublishingTestExecutionListener ro'yxatdan o'tkazilishi kerak.

Xuddi shunday, agar @DirtiesContext annotatsiyasidan kontekst keshidan ApplicationContext'ni olib tashlash uchun foydalanilsa, ma'lum test sinfi uchun AfterTestClassEvent hodisasi e'lon qilinmaydi.

Test ijrosi hodisalarini tinglash uchun Spring beani org.springframework.context.ApplicationListener interfeysini amalga oshirishni tanlashi mumkin. Bundan tashqari, tinglovchilarning usullari yuqorida ko'rsatilgan maxsus hodisalarning birini tinglashga sozlanishi va @EventListener bilan annotatsiyalangan bo'lishi mumkin (qarang: Annotatsiyalarga asoslangan hodisalar tinglovchilari).
Bu yondashuvning mashhurligi sababli, Spring quyidagi maxsus @EventListener annotatsiyalarni test ijrosi hodisalarini tinglashni ro'yxatdan o'tkazishni osonlashtirish uchun taqdim etadi. Ular org.springframework.test.context.event.annotation paketida joylashgan.

  • @BeforeTestClass

  • @PrepareTestInstance

  • @BeforeTestMethod

  • @BeforeTestExecution

  • @AfterTestExecution

  • @AfterTestMethod

  • @AfterTestClass

Istisnolarni qayta ishlash

Odatiy holda, agar test ijrosi hodisalarini tinglovchi hodisa iste'mol qilishda istisno chiqaradigan bo'lsa, bu istisno ishlatilayotgan asosiy test framework ga taqdim etiladi (masalan, JUnit yoki TestNG). Masalan, BeforeTestMethodEvent hodisasi iste'mol qilish istisno chiqarsa, ushbu istisno natijasida tegishli test usuli xato bilan tugaydi. Va aksincha, agar asinxron hodisalar tinglovchi istisno chiqaradigan bo'lsa, bu bazaviy test framework ga tarqatilmaydi. Asinxron hodisalar istisnolarini qayta ishlash haqida ko'proq ma'lumot olish uchun sinf darajasidagi @EventListener javadoc ga qarang.

Asinxron tinglovchilar

Agar muayyan test ijrosi hodisalarini tinglovchisi hodisalarni asinxron qayta ishlashini xohlasangiz, unda Spring dan @Async annotatsiyasi orqali odatiy yordamni foydalanishingiz mumkin.
Batafsil ma'lumot uchun sinf darajasidagi @EventListener javadoc ga qarang.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION