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ə buApplicationEvents
nümunəsindən test metodlarınızda və həyat dövrü metodlarında (məsələn, JUnit Jupiter-də@BeforeEach
və@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 SpringExtension
və AssertJ 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:
@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);
}
}
- Test sinfini
@RecordApplicationEvents
ilə anotasiya edirik. - Cari test üçün
ApplicationEvents
nümunəsini daxil edirik. ApplicationEvents
API interfeysindən istifadə edərək, neçəOrderSubmitted
hadisəsinin yayımlandığını sayırıq.
@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)
}
}
- Test sinfini
@RecordApplicationEvents
ilə anotasiya edirik. - Cari test üçün
ApplicationEvents
nümunəsini daxil edirik. 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.
GO TO FULL VERSION