ConfigDataApplicationContextInitializer
ConfigDataApplicationContextInitializer – bu ApplicationContextInitializer bo'lib, uni testlar uchun application.properties fayllarini yuklashda ishlatish mumkin bo'lgan Spring Boot. Agar sizga @SpringBootTest annotatsiyasi bilan ta'minlangan barcha funksiyalar kerak bo'lmasa, uni quyidagi misolda ko'rsatilgandek ishlatishingiz mumkin:
@ContextConfiguration(classes = Config.class, initializers = ConfigDataApplicationContextInitializer.class) class MyConfigFileTests { // ... }
@ContextConfiguration(classes = [Config::class], initializers = [ConfigDataApplicationContextInitializer::class]) class MyConfigFileTests { // ... }
ConfigDataApplicationContextInitializer sinfini faqatgina ishlatish
@Value("${…}") annotatsiyasi qo'llab-quvvatlanishini ta'minlamaydi. Uning yagona vazifasi -
application.properties fayllarini Spring
Environment ga yuklashni ta'minlash.
@Value annotatsiyasini qo'llab-quvvatlash uchun ya'ni,
PropertySourcesPlaceholderConfigurer ni qo'shimcha ravishda sozlash kerak yoki
@SpringBootTest annotatsiyasidan foydalaning, u siz uchun avto sozlaydi.
TestPropertyValues
TestPropertyValues sinfi ConfigurableEnvironment yoki ConfigurableApplicationContext ga tezda xususiyat qo'shish imkonini beradi. Uni key=value satrlari yordamida qo'llash mumkin, quyida ko'rsatilgandek:
class MyEnvironmentTests { @Test void testPropertySources() { MockEnvironment environment = new MockEnvironment(); TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment); assertThat(environment.getProperty("name")).isEqualTo("Boot"); } }
class MyEnvironmentTests { @Test fun testPropertySources() { val environment = MockEnvironment() TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment) assertThat(environment.getProperty("name")).isEqualTo("Boot") } }
OutputCapture
OutputCapture – bu JUnit uchun Extension bo'lib, u System.out va System.err ni saqlab olish uchun ishlatiladi. Foydalanish uchun @ExtendWith(OutputCaptureExtension.class) annotatsiyasini qo'shing va CapturedOutput ni test sinfi konstruktori yoki test metodi argumenti sifatida qo'shing, quyidagi usulda:
@ExtendWith(OutputCaptureExtension.class) class MyOutputCaptureTests { @Test void testName(CapturedOutput output) { System.out.println("Assalomu alaykum, Dunyo!"); assertThat(output).contains("Dunyo"); } }
@ExtendWith(OutputCaptureExtension::class) class MyOutputCaptureTests { @Test fun testName(output: CapturedOutput?) { println("Assalomu alaykum, Dunyo!") assertThat(output).contains("Dunyo") } }
TestRestTemplate
TestRestTemplate Spring'dan RestTemplate uchun qulay alternativa bo'lib, u integratsion testlar doirasida foydali. Siz oddiy shablonni yoki asosiy HTTP-autentifikatsiyani (foydalanuvchi nomi va parol bilan) yuboradigan shablonni olishingiz mumkin. Har qanday holatda, shablon muvaffaqiyatsizliklarga chidamli. Bu uning ishlash logikasi testlash uchun qulay va 4xx va 5xx xatoliklari bo'lganda istisno (exception) hosil qilmaydi. Buning o'rniga bunday xatolar qaytadan ResponseEntity va uning status kodidan aniqlanishi mumkin.
WebTestClient ni ko'rsatadi, u
WebFlux'da integratsion testlar va
WebFlux va MVC'da o'zaro testlar uchun yaxshi mos keladi.
TestRestTemplatedan farqli o'laroq, u da'volar qo'shish uchun moslashuvchan API taqdim etadi.
Apache HTTP Client (4.3.2 yoki undan yuqori versiyasi) dan foydalanish tavsiya etiladi – lekin majburiy emas. Agar u sizning classpath'ingizda mavjud bo'lsa, TestRestTemplate shabloni bunga javob berib, muvofiq mijozni sozlaydi. Agar siz Apache HTTP mijozini foydalsangiz, testlash uchun foydali bir qancha qo'shimcha funksiyalar qo'shiladi:
-
Yo'nalishlar ko'zdan kechirilmaydi (shuning uchun javob joylashuvi uchun da'volarni qo'shish mumkin).
-
Cookie fayllar e'tibordan chetda (shablon holatni saqlamaydi).
TestRestTemplate'ning bir nusxasini integratsion testlarda to'g'ridan-to'g'ri ishlab chiqarishingiz mumkin, quyidagi misolda ko'rsatilgandek:
class MyTests { private final TestRestTemplate template = new TestRestTemplate(); @Test void testRequest() { ResponseEntity<String> headers = this.template.getForEntity("https://myhost.example.com/example", String.class); assertThat(headers.getHeaders().getLocation()).hasHost("other.example.com"); } }
class MyTests { private val template = TestRestTemplate() @Test fun testRequest() { val headers = template.getForEntity("https://myhost.example.com/example", String::class.java) assertThat(headers.headers.location).hasHost("other.example.com") } }
Bundan tashqari, agar siz WebEnvironment.RANDOM_PORT yoki WebEnvironment.DEFINED_PORT bilan @SpringBootTest annotatsiyasidan foydalansangiz, to'liq sozlangan TestRestTemplate ni qo'shib, foydalanishni boshlashingiz mumkin. Zarurat bo'lganda, qo'shimcha sozlamalarni RestTemplateBuilder bean orqali qo'llash mumkin. Har qanday host va port ko'rsatilmagan URLlar avtomatik holda ichki serverga ulashadi, quyidagi misolda ko'rsatilgandek:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) class MySpringBootTests { @Autowired private TestRestTemplate template; @Test void testRequest() { HttpHeaders headers = this.template.getForEntity("/example", String.class).getHeaders(); assertThat(headers.getLocation()).hasHost("other.example.com"); } @TestConfiguration(proxyBeanMethods = false) static class RestTemplateBuilderConfiguration { @Bean RestTemplateBuilder restTemplateBuilder() { return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1)) .setReadTimeout(Duration.ofSeconds(1)); } } }
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) class MySpringBootTests(@Autowired val template: TestRestTemplate) { @Test fun testRequest() { val headers = template.getForEntity("/example", String::class.java).headers assertThat(headers.location).hasHost("other.example.com") } @TestConfiguration(proxyBeanMethods = false) internal class RestTemplateBuilderConfiguration { @Bean fun restTemplateBuilder(): RestTemplateBuilder { return RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1)) .setReadTimeout(Duration.ofSeconds(1)) } } }
GO TO FULL VERSION