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
@RecordApplicationEventsyordamida anotatsiya qilingan yoki meta-anotatsiya qilinganligiga ishonch hosil qiling. -
ApplicationEventsTestExecutionListenerro'yxatdan o'tganligiga ishonch hosil qiling. Qayd eting,ApplicationEventsTestExecutionListenerodatiy holda ro'yxatdan o'tkaziladi, va agar sizda@TestExecutionListenersannotatsiyasi orqali maxsus konfiguratsiya mavjud bo'lsa, uni qo'lda ro'yxatdan o'tkazish kerak, bu odatiy tinglovchilarni o'z ichiga olmaydi. -
ApplicationEventsturidagi maydonni@Autowiredannotatsiyasi bilan annotatsiya qiling va ushbuApplicationEventsnamunadan test usullari va hayot tsikli usullarida (masalan, JUnit Jupiter da@BeforeEachva@AfterEachannotatsiyalari bilan belgilangan usullarda) foydalaning.-
JUnit Jupiter uchun SpringExtension kengaytmasidan foydalanganda, test usulida yoki test klassidagi
@Autowiredbilan anotatsiya qilingan maydon o'rniga hayot tsikli usulidaApplicationEventsturidagi 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:
@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);
}
}
- Test sinfini
@RecordApplicationEventsyordamida annotatsiya qilamiz. - Joriy test uchun
ApplicationEventsnamunani kiritamiz. OrderSubmittedhodisalar qancha e'lon qilinganligini hisoblash uchunApplicationEventsAPI interfeysidan foydalanamiz.
@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)
}
}
- Test sinfini
@RecordApplicationEventsyordamida annotatsiya qilamiz. - Joriy test uchun
ApplicationEventsnamunani kiritamiz. OrderSubmittedhodisalar qancha e'lon qilinganligini hisoblash uchunApplicationEventsAPI 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.
GO TO FULL VERSION