JavaRush /Kurslar /All lectures for UZ purposes /JUnit Jupiter Test Annotatsiyalari

JUnit Jupiter Test Annotatsiyalari

All lectures for UZ purposes
Daraja, Dars
Mavjud

Quyidagi annotatsiyalar SpringExtension va JUnit Jupiter (ya'ni JUnit 5da dasturlash modeli) bilan birgalikda ishlatilganda qo'llab-quvvatlanadi:

@SpringJUnitConfig

@SpringJUnitConfig - bu JUnit Jupiter'dan @ExtendWith(SpringExtension.class) va Spring TestContext Framework'dan @ContextConfiguration'ni birlashtiradigan tarkibiy annotatsiya. Uni sinf darajasida @ContextConfiguration'ga o'rinbosar sifatida ishlatish mumkin. Konfiguratsiya parametrlariga kelsak, @ContextConfiguration va @SpringJUnitConfig annotatsiyalari orasidagi yagona farq @SpringJUnitConfig'dagi komponent sinflar value atributi bilan e'lon qilinishi mumkin.

Quyidagi misolda @SpringJUnitConfig annotatsiyasidan konfiguratsiya sinfini belgilash uchun qanday foydalanishni ko'rsatamiz:

Java
@SpringJUnitConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // sinf tanasi...
}
  1. Konfiguratsiya sinfini belgilaymiz.
Kotlin
@SpringJUnitConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // sinf tanasi...
}
  1. Konfiguratsiya sinfini belgilaymiz.

Quyidagi misolda @SpringJUnitConfig annotatsiyasidan konfiguratsion faylning joylashuvini belgilash uchun qanday foydalanishni ko'rsatamiz:

Java
@SpringJUnitConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringTests {
    // sinf tanasi...
}
  1. Konfiguratsion faylning joylashuvini belgilaymiz.
Kotlin
@SpringJUnitConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringTests {
    // sinf tanasi...
}
  1. Konfiguratsion faylning joylashuvini belgilaymiz.

Batafsil ma'lumotni "Kontekst boshqaruvi" bo'limida hamda @SpringJUnitConfig va @ContextConfiguration javadoc'da ko'rishingiz mumkin.

@SpringJUnitWebConfig

@SpringJUnitWebConfig - bu JUnit Jupiter'dan @ExtendWith(SpringExtension.class) va Spring TestContext Framework'dan @ContextConfiguration va @WebAppConfiguration bilan birlashtirilgan tarkibiy annotatsiya. Uni sinf darajasida @ContextConfiguration va @WebAppConfiguration annotatsiyalariga o'rinbosar sifatida ishlatish mumkin. Konfiguratsiya parametrlariga kelsak, @ContextConfiguration va @SpringJUnitWebConfig annotatsiyalari orasidagi yagona farq @SpringJUnitWebConfig annotatsiyasida komponent sinflar value atributi bilan e'lon qilinishi mumkin. Qo'shimcha, @WebAppConfiguration annotatsiyasida value atributining qiymati faqat @SpringJUnitWebConfig annotatsiyasidagi resourcePath atributi yordamida almashtirilishi mumkin.

Quyidagi misolda @SpringJUnitWebConfig annotatsiyasidan konfiguratsiya sinfini belgilash uchun qanday foydalanishni ko'rsatamiz:

Java
@SpringJUnitWebConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // sinf tanasi...
}
  1. Konfiguratsiya sinfini belgilaymiz.
Kotlin
@SpringJUnitWebConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // sinf tanasi...
}
  1. Konfiguratsiya sinfini belgilaymiz.

Quyidagi misolda @SpringJUnitWebConfig annotatsiyasidan konfiguratsion faylning joylashuvini belgilash uchun qanday foydalanishni ko'rsatamiz:

Java
@SpringJUnitWebConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringWebTests {
    // sinf tanasi...
}
  1. Konfiguratsion faylning joylashuvini belgilaymiz.
Kotlin
@SpringJUnitWebConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringWebTests {
    // sinf tanasi...
}
  1. Konfiguratsion faylning joylashuvini belgilaymiz.

Batafsil ma'lumotni "Kontekst boshqaruvi" bo'limida, shuningdek @SpringJUnitWebConfig, @ContextConfiguration va @WebAppConfiguration javadoc'da ko'rishingiz mumkin.

@TestConstructor

@TestConstructor - bu sinf darajasidagi annotatsiya bo'lib, u test sinfi konstruktorining parametrlarini qanday qilib avtomatik ravishda aniqlash va ApplicationContext testidan komponentlar bilan bog'lashni sozlash uchun ishlatiladi.

Agar @TestConstructor annotatsiyasi yoq bo'lmasa yoki test sinfida metaanotatsiya orqali mavjud bo'lsa, odatiy test konstruktori avtomatik aniqlash va bog'lash rejimi ishlatiladi. Odatiy rejimni qanday o'zgartirish haqida batafsil ma'lumotni quyidagi maslahatda ko'rishingiz mumkin. Shuni bilish kerakki, test konstruktori uchun @Autowired annotatsiyasining mahalliy deklaratsiyasi @TestConstructor va odatiy rejimdan ustun turadi.

Test konstruktori avtomatik aniqlash va bog'lash rejimini o'zgartirish

Test konstruktori avtomatik aniqlash va bog'lash rejimini JVM'dan spring.test.constructor.autowire.mode tizim xususiyatini all qiymatiga o'rnatish orqali o'zgartirish mumkin. Bundan tashqari, odatiy rejim SpringProperties mexanizmi orqali o'rnatilishi mumkin.

Spring Framework 5.3'dan boshlab, odatiy rejim JUnit Platform konfiguratsiya parametri sifatida ham sozlanishi mumkin.

Agar spring.test.constructor.autowire.mode xususiyati o'rnatilmagan bo'lsa, test sinflar konstruktorlari avtomatik ravishda aniqlanmaydi va bog'lanmaydi.

Spring Framework 5.2'dan boshlab, @TestConstructor annotatsiyasi faqat SpringExtension bilan birgalikda JUnit Jupiter'da ishlatish uchun qo'llab-quvvatlanadi. Shuni eslatib o'tish joizki, SpringExtension ko'pincha avtomatik ravishda ro'yxatdan o'tkaziladi – masalan, @SpringJUnitConfig va @SpringJUnitWebConfig annotatsiyalaridan foydalanishda yoki Spring Boot Test'dan turli test bilan bog'liq annotatsiyalarda.

@NestedTestConfiguration

@NestedTestConfiguration - bu sinflar ierarxiyasida ichki test sinflari uchun Spring test konfigurasiya annotatsiyalarini qanday ishlatishni sozlash uchun ishlatiladigan sinf darajasidagi annotatsiya.

Agar @NestedTestConfiguration annotatsiyasi yoq bo'lmasa yoki test sinfida metaanotatsiya orqali mavjud bo'lsa, uning supertiplar ierarxiyasida yoki uning quyi sinflar ierarxiyasida bo'lsa, umumiy konfiguratsiya merosxo'rlik rejimi odatiy ishlatiladi. Odatiy rejimni qanday o'zgartirish haqida batafsil ma'lumotni quyidagi maslahatda ko'rishingiz mumkin.

Umumiy konfiguratsiya merosxo'rlik rejimini o'zgartirish

Odatiy umumiy konfiguratsiya merosxo'rlik rejimi INHERIT bo'lib, lekin uni JVM'dan spring.test.enclosing.configuration tizim xususiyatini OVERRIDE qiymatiga o'zgartirish orqali o'zgartirish mumkin. Shu bilan birga, odatiy rejim SpringProperties mexanizmi orqali o'rnatilishi mumkin.

Spring TestContext Framework quyidagi annotatsiyalar uchun @NestedTestConfiguration annotatsiyasi semantikasini qo'llab-quvvatlaydi.

@NestedTestConfiguration annotatsiyasidan foydalanish odatda JUnit Jupiter'dan @Nested annotatsiyasi bilan belgilangan sinflar uchun mantiqiy; ammo, Spring va ichki sinflarni qo'llab-quvvatlaydigan boshqa test ramkalar mavjud bo'lishi mumkin, bu esa bu annotatsiyani ishlatadi.

@Nested annotatsiyali sinf konfiguratsiyasi haqida ko'proq ma'lumot olish uchun "Test sinf konfiguratsiyasi" bo'limiga qarang.

@EnabledIf

@EnabledIf annotatsiyasi JUnit Jupiter'dan annotatsiyalangan test sinfi yoki test metodi faollashtirilganligini va bajarilishi kerakligini bildiradi, agar ko'rsatilgan expression true bo'lsa. Aniqrog'i, agar ifoda Boolean.TRUE yoki String teng true bo'lsa (kichiklotfuqat farqsiz), test faollashadi. Sinf darajasida qo'llanilsa, ushbu sinfdagi barcha test metodlari ham avtomatik ravishda faollashadi.

Ifodalar quyidagi shakllardan biriga ega bo'lishi mumkin:

  • Spring Expression Language (SpEL) ifodasi. Misol: @EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Framwork Spring'ning Environment'ida mavjud bo'lgan xususiyatlar uchun plaseholder. Misol: @EnabledIf("${smoke.tests.enabled}")

  • Matnli literallar. Misol: @EnabledIf("true")

Biroq, shuni bilish kerakki, dinamik xususiyat yer almashtirish natijasi bo'lmagan matnli literal amaliy qiymatga ega emas, chunki @EnabledIf("false") annotatsiyasi @Disabled annotatsiyasiga teng, va @EnabledIf("true") annotatsiyasi mantiqan hech qanday maqsadga ega emas.

@EnabledIf anotatsiyasini maxsus tarkibiy annotatsiyalar yaratish uchun meta-annotatsiya sifatida qo'llashingiz mumkin. Masalan, quyidagicha maxsus @EnabledOnMac annotatsiyasini yaratishingiz mumkin:

Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
Kotlin
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@EnabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Enabled on Mac OS"
)
annotation class EnabledOnMac {}

@EnabledOnMac annotatsiyasi faqat ushbu imkoniyatning mavjudligini ko'rsatish uchun misol sifatida xizmat qiladi. Agar sizda xuddi shunday holat mavjud bo'lsa, JUnit Jupiter'da mavjud @EnabledOnOs(MAC) annotatsiyasi bilan foydalaning.

JUnit 5.7'dan boshlab, JUnit Jupiter shuningdek, @EnabledIf deb nomlangan shartli annotatsiyasi bor. Shunday qilib, agar sizga Spring'da @EnabledIf annotatsiya qo'llab-quvvatlovi kerak bo'lsa, annotatsiya turini to'g'ri pakettan import qiling.

@DisabledIf

@DisabledIf annotatsiyasi JUnit Jupiter'dan annotatsiyalangan test sinfi yoki test metodi bekor qilinganini va bajarilmasligini bildiradi, agar ko'rsatilgan ifoda true bo'lsa. Aniqrog'i, agar ifoda Boolean.TRUE yoki String teng true bo'lsa (kichiklotfuqat farqsiz), test bekor qilinadi. Sinf darajasida qo'llanilsa, ushbu sinfdagi barcha test metodlari ham avtomatik ravishda bekor qilinadi.

Ifodalar quyidagi shakllardan biriga ega bo'lishi mumkin:

  • Spring Expression Language (SpEL) ifodasi. Misol: @DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Framwork Spring'ning Environment'ida mavjud bo'lgan xususiyatlar uchun plaseholder. Misol: @DisabledIf("${smoke.tests.disabled}")

  • Matnli literallar. Misol: @DisabledIf("true")

Biroq, shuni bilish kerakki, dinamik xususiyat yer almashtirish natijasi bo'lmagan matnli literal amaliy qiymatga ega emas, chunki @DisabledIf("true") annotatsiyasi @Disabled annotatsiyasiga teng, va @DisabledIf("false") annotatsiyasi mantiqan hech qanday maqsadga ega emas.

@DisabledIf annotatsiyasini maxsus tarkibiy annotatsiyalar yaratish uchun meta-annotatsiya sifatida qo'llashingiz mumkin. Masalan, quyidagicha maxsus @DisabledOnMac annotatsiyasini yaratishingiz mumkin:

Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
Kotlin
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@DisabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Disabled on Mac OS"
)
annotation class DisabledOnMac {}

@DisabledOnMac annotatsiyasi faqat ushbu imkoniyatning mavjudligini ko'rsatish uchun misol sifatida xizmat qiladi. Agar sizda xuddi shunday holat mavjud bo'lsa, JUnit Jupiter'da mavjud @DisabledOnOs(MAC) annotatsiyasini ishlating.

JUnit 5.7'dan boshlab, JUnit Jupiter shuningdek, @DisabledIf deb nomlangan shartli annotatsiyasi bor. Shunday qilib, agar sizga Spring'da @DisabledIf annotatsiya qo'llab-quvvatlovi kerak bo'lsa, annotatsiya turini to'g'ri pakettan import qiling.

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