Tətbiq Tədbirləri

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

Spring Framework-un 5.3.3 versiyasından başlayaraq, TestContext çərçivəsi, ApplicationContext-də yayımlanan tətbiq hadisələrinin yazılması üçün dəstək təmin edir ki, bu hadisələr testlərdə təsdiqlənə bilsin. Bir testin icrası zamanı yayımlanan bütün hadisələr ApplicationEvents API interfeysi vasitəsilə mövcuddur ki, bu da hadisələri java.util.Stream kimi emal etməyə imkan verir.

Testlərinizdə ApplicationEvents istifadə etmək üçün aşağıdakıları edin.

  • Test sinifinizin @RecordApplicationEvents ilə anotasiya edildiyindən və ya meta-anotasiya edildiyindən əmin olun.

  • ApplicationEventsTestExecutionListener-in qeydiyyatdan keçdiyinə əmin olun. Qeyd edin ki, ApplicationEventsTestExecutionListener varsayılan olaraq qeydiyyatdan keçmişdir və onu əl ilə qeyd etməyə yalnız sizin @TestExecutionListeners anotasiya vasitəsilə xüsusi konfiqurasiyanız varsa ehtiyac var, hansı ki varsayılan dinləyiciləri daxil etmir.

  • ApplicationEvents tipli sahəni @Autowired annotasiyası ilə anotasiya edin və bu ApplicationEvents nümunəsindən test metodlarınızda və həyat dövrü metodlarında (məsələn, JUnit Jupiter-də @BeforeEach@AfterEach annotasiyaları ilə qeyd olunmuş metodlar) istifadə edin.

    • JUnit Jupiter üçün SpringExtension istifadə edərkən, ApplicationEvents tipli metod parametrini test metodunda və ya həyat dövrü metodunda, test sinifində @Autowired ilə anotasiya edilmiş sahənin alternativi olaraq elan edə bilərsiniz.

Aşağıdakı test sinfi JUnit Jupiter üçün SpringExtensionAssertJ istifadə edərək, Spring tərəfindən idarə olunan komponentdə metod çağırışında yayımlanan tətbiq hadisələri növlərini təsdiqləyir:

Java
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents 
class OrderServiceTests {
    @Autowired
    OrderService orderService;
    @Autowired
    ApplicationEvents events; 
    @Test
    void submitOrder() {
        // OrderService-də metod çağırırıq ki, bu da hadisə yayımlayır
        orderService.submitOrder(new Order(/* ... */));
        // OrderSubmitted hadisəsinin yayımlandığını yoxlayırıq
        long numEvents = events.stream(OrderSubmitted.class).count(); 
        assertThat(numEvents).isEqualTo(1);
    }
}
  1. Test sinfini @RecordApplicationEvents ilə anotasiya edirik.
  2. Cari test üçün ApplicationEvents nümunəsini daxil edirik.
  3. ApplicationEvents API interfeysindən istifadə edərək, neçə OrderSubmitted hadisəsinin yayımlandığını sayırıq.
Kotlin
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents 
class OrderServiceTests {
    @Autowired
    lateinit var orderService: OrderService
    @Autowired
    lateinit var events: ApplicationEvents 
    @Test
    fun submitOrder() {
        // OrderService-də metod çağırırıq ki, bu da hadisə yayımlayır
        orderService.submitOrder(Order(/* ... */))
        // OrderSubmitted hadisəsinin yayımlandığını yoxlayırıq
        val numEvents = events.stream(OrderSubmitted::class).count() 
        assertThat(numEvents).isEqualTo(1)
    }
}
  1. Test sinfini @RecordApplicationEvents ilə anotasiya edirik.
  2. Cari test üçün ApplicationEvents nümunəsini daxil edirik.
  3. ApplicationEvents API interfeysindən istifadə edərək, neçə OrderSubmitted hadisəsinin yayımlandığını sayırıq.

Əlavə məlumat üçün ApplicationEvents API interfeysinə baxın.

Test İcrasında Tədbirlər

Spring Framework 5.2-də təqdim edilən EventPublishingTestExecutionListener xüsusi TestExecutionListener həyata keçirilməsinə alternativ bir yanaşma təklif edir. Təqdim olunan komponentlər ApplicationContext testində EventPublishingTestExecutionListener tərəfindən yayımlanan aşağıdakı hadisələri dinləyə bilər, hər biri TestExecutionListener API interfeysinə uyğun metoddur.

  • BeforeTestClassEvent

  • PrepareTestInstanceEvent

  • BeforeTestMethodEvent

  • BeforeTestExecutionEvent

  • AfterTestExecutionEvent

  • AfterTestMethodEvent

  • AfterTestClassEvent

Bu hadisələr müxtəlif səbəblərə görə istifadə edilə bilər, məsələn, mock-obyektlərin sıfırlanması və ya test icrasının izlenmesi üçün. Test icra hadisələrinin istehlakının xüsusi bir TestExecutionListener həyata keçirilməsinə nisbətən üstünlüklərindən birisə odur ki, test icra hadisələri test ApplicationContext-ində qeydiyyatdan keçmiş istənilən Spring bin tərəfindən istehlak edilə bilər və belə binlər birbaşa asılılıqların daxil edilməsi və ApplicationContext-in digər funksiyalarından istifadə edə bilərlər. Bunun əksinə, TestExecutionListener ApplicationContext-də bin deyil.

EventPublishingTestExecutionListener varsayılan olaraq qeydiyyatdan keçir; lakin o, hadisələri yalnız ApplicationContext artıq yüklənmişdirsə yayımlayır. Bu, ApplicationContext-in lazımsız və ya çox erkən yüklənməsinin qarşısını alır.

Buna görə də, BeforeTestClassEvent hadisəsi yalnız ApplicationContext başqa bir TestExecutionListener tərəfindən yükləndikdən sonra yayımlanacaq. Məsələn, varsayılan olaraq qeydiyyatdan keçmiş TestExecutionListener dəstlərini istifadə edərkən, müəyyən bir test ApplicationContext istifadə edən ilk test sinfi üçün BeforeTestClassEvent hadisəsi yayımlanmayacaq, lakin eyni test setində eyni test ApplicationContext istifadə edən növbəti test sinfi üçün BeforeTestClassEvent hadisəsi yaymlanacaq, çünki kontekst artıq sonrakı test siniflərinin icrası zamanı yüklənəcək (əgər kontekst ContextCache-dən @DirtiesContext annotasiyası və ya maksimum ölçüyə çatdıqda yerindən çıxarılma siyasəti ilə silinməmişdirsə).

Əgər istəyirsinizsə ki, BeforeTestClassEvent hadisəsi hər bir test sinfi üçün həmişə yayımlansın, o zaman beforeTestClass geri çağırma funksiyasında ApplicationContext-i yükləyən TestExecutionListener qeydiyyatdan keçirmək lazımdır və həmin TestExecutionListener bəzilərində EventPublishingTestExecutionListener-dan əvvəl qeydiyyatdan keçməlidir.

Eynilə, əgər @DirtiesContext annotasiyası son test metodundan sonra ApplicationContext-i kontekst cache-dən çıxarmaq üçün istifadə olunursa, bu test sinfi üçün AfterTestClassEvent hadisəsi yayımlanmayacaq.

Test icra hadisələrini dinləmək üçün Spring bin org.springframework.context.ApplicationListener interfeysini həyata keçirməyi seçə bilər. Həmçinin, dinləyici metodlar @EventListener annotasiyası ilə anotasiya edilə bilər və yuxarıda sadalanan xüsusi hadisə növlərindən birini dinləmək üçün konfiqurasiya edilə bilər (bax: Anotasiya əsaslı hadisə dinləyiciləri (alıcılar) .
Bu yanaşmanın populyarlığına görə, Spring, test icra hadisə dinləyicilərini qeydiyyatdan keçirmək üçün xüsusi @EventListener anotasiya təmin edir. Bu annotasiyalar org.springframework.test.context.event.annotation paketində yerləşir.

  • @BeforeTestClass

  • @PrepareTestInstance

  • @BeforeTestMethod

  • @BeforeTestExecution

  • @AfterTestExecution

  • @AfterTestMethod

  • @AfterTestClass

İstisna Halların İdarə Olunması

Varsayılan olaraq, əgər test icra hadisə dinləyicisi hadisə istehlakı zamanı istisna halı yaradırsa, bu istisna istifadə edilən əsas test çərçivəsinə (məsələn, JUnit və ya TestNG) ötürülür. Məsələn, əgər BeforeTestMethodEvent hadisəsinin istehlakı istisna yaradarsa, müvafiq test metodu bu istisna nəticəsində uğursuz olacaq. Əksinə, əgər asinxron test icra hadisə dinləyicisi istisna yaradırsa, bu istisna əsas test çərçivəsinə ötürülməyəcək. Asinxron istisna idarə olunması haqqında daha ətraflı məlumat üçün @EventListener C səviyyəsindəki javadoc-a baxın.

Asinxron Dinləyicilər

Əgər müəyyən bir test icra hadisə dinləyicisinin hadisələri asinxron şəkildə emal etməsi lazımdırsa, Spring-dən @Async annotasiyası dəstəyindən istifadə edə bilərsiniz.
Daha ətraflı məlumat üçün @EventListener C səviyyəsindəki javadoc-a baxın.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION