JavaRush /Kurslar /All lectures for AZ purposes /Test üçün meta-anotasiya dəstəyi

Test üçün meta-anotasiya dəstəyi

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

Testlə bağlı əksər anotasiya tipləri, test dəstində konfiqurasiya təkrarlanmasını azaldaraq öz annotasiyalarınızı yaratmaq üçün meta-anotasiya kimi istifadə edilə bilər.

Hər bir aşağıdakı anotasiya TestContext çərçivəsi ilə birlikdə meta-anotasiya kimi istifadə oluna bilər.

  • @BootstrapWith

  • @ContextConfiguration

  • @ContextHierarchy

  • @ActiveProfiles

  • @TestPropertySource

  • @DirtiesContext

  • @WebAppConfiguration

  • @TestExecutionListeners

  • @Transactional

  • @BeforeTransaction

  • @AfterTransaction

  • @Commit

  • @Rollback

  • @Sql

  • @SqlConfig

  • @SqlMergeMode

  • @SqlGroup

  • @Repeat (yalnız JUnit 4-də dəstəklənir)

  • @Timed (yalnız JUnit 4-də dəstəklənir)

  • @IfProfileValue (yalnız JUnit 4-də dəstəklənir)

  • @ProfileValueSourceConfiguration (yalnız JUnit 4-də dəstəklənir)

  • @SpringJUnitConfig (yalnız JUnit Jupiter-də dəstəklənir)

  • @SpringJUnitWebConfig (yalnız JUnit Jupiter-də dəstəklənir)

  • @TestConstructor (yalnız JUnit Jupiter-də dəstəklənir)

  • @NestedTestConfiguration (yalnız JUnit Jupiter-də dəstəklənir)

  • @EnabledIf (yalnız JUnit Jupiter-də dəstəklənir)

  • @DisabledIf (yalnız JUnit Jupiter-də dəstəklənir)

Aşağıdakı nümunəyə baxaq:

Java
@RunWith(SpringRunner.class)
// @ContextConfiguration annotasiyası
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
// Testlərin tranzaksional olaraq keçməsi
@Transactional
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class UserRepositoryTests { }
Kotlin
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }

Mövcud konfiqurasiyanın test dəstimizdə təkrarlandığı aşkar olunarsa, xüsusi birləşdirilmiş anotasiya tətbiq edərək Spring-in ümumi test konfiqurasiyasını mərkəzləşdirərək dublikatı azalda bilərik:

Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }

Bundan sonra @TransactionalDevTestConfig annotasiyası ilə JUnit 4 əsasında ayrı-ayrı test siniflərinin konfiqurasiyasını asanlaşdıra bilərik, aşağıdakı kimi:

Java
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class UserRepositoryTests { }
Kotlin
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class OrderRepositoryTests
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class UserRepositoryTests

JUnit Jupiter-dən istifadə edərək testlər yazarkən, JUnit 5-də də anotasiya meta-anotasiya kimi istifadə edilə bildiyindən, kodun təkrarını daha da azalda bilərik. Aşağıdakı nümunə ilə bax:

Java
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
Kotlin
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }

Mövcud konfiqurasiyanın JUnit Jupiter əsasında test dəstimizdə təkrarlandığı aşkar olunarsa, xüsusi birləşdirilmiş anotasiya tətbiq edərək Spring və JUnit Jupiter üçün ümumi test konfiqurasiyasını mərkəzləşdirərək dublikatı azalda bilərik:

Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }

Bundan sonra @TransactionalDevTestConfig annotasiyası ilə JUnit Jupiter əsasında ayrı-ayrı test siniflərinin konfiqurasiyasını asanlaşdıra bilərik, aşağıdakı kimi:

Java
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
Kotlin
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }

Çünki JUnit Jupiter @Test, @RepeatedTest, ParameterizedTest və digər anotasiya tiplərini meta-anotasiya kimi istifadə etməyə imkan verir, test metodunun səviyyəsində də öz birləşdirilmiş anotasiya tiplərinizi yarada bilərsiniz. Məsələn, @Test@Tag annotasiyalarını JUnit Juipter-dən @Transactional annotasiyası ilə birləşdirən bir birləşdirilmiş anotasiya yaratmaq istəsəniz, @TransactionalIntegrationTest annotasiyasını aşağıdakı kimi yarada bilərsiniz:

Java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
public @interface TransactionalIntegrationTest { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
annotation class TransactionalIntegrationTest { }

Bundan sonra @TransactionalIntegrationTest annotasiyası ilə JUnit Jupiter əsasında test metodlarının konfiqurasiyasını kolaylaşdıra bilərik, aşağıdakı kimi:

Java
@TransactionalIntegrationTest
void saveOrder() { }
@TransactionalIntegrationTest
void deleteOrder() { }
Kotlin
@TransactionalIntegrationTest
fun saveOrder() { }
@TransactionalIntegrationTest
fun deleteOrder() { }

Daha ətraflı məlumatı Spring Annotation Programming Model viki səhifəsində tapa bilərsiniz.

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