ConfigDataApplicationContextInitializer
ConfigDataApplicationContextInitializer
- bu ApplicationContextInitializer
bo'lib, Spring Boot uchun application.properties
fayllarni yuklash uchun testlarga qo'llash mumkin. Agar sizga @SpringBootTest
annotatsiyasi tomonidan taqdim etilgan to'liq funksiyalar to'plami 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
klassidan foydalanish,
@Value("${…}")
annotatsiyasini qo'llab-quvvatlashni ta'minlamaydi. Uning yagona vazifasi -
application.properties
fayllarni Spring uchun
Environment
ga yuklash.
@Value
annotatsiyasini qo'llab-quvvatlashni ta'minlash uchun siz qo'shimcha ravishda
PropertySourcesPlaceholderConfigurer
ni sozlashingiz kerak yoki
@SpringBootTest
annotatsiyasini ishlatishingiz kerak, bu unga avtomatik ravishda sozlanadi.
TestPropertyValues
TestPropertyValues
klassi ConfigurableEnvironment
yoki ConfigurableApplicationContext
ga xususiyatlarni tezda qo'shish imkonini beradi. Uni key=value
ko'rinishidagi satrlar bilan chaqirish 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, System.out
va System.err
chiqishlarini qo'lga kiritishda yordam beradi. Uni ishlatish uchun @ExtendWith(OutputCaptureExtension.class)
annotatsiyasini qo'shing va CapturedOutput
ni sinfingizning konstruktori yoki test metodiga argument sifatida kiritib qo'ying, quyida ko'rsatilgandek:
@ExtendWith(OutputCaptureExtension.class) class MyOutputCaptureTests { @Test void testName(CapturedOutput output) { System.out.println("Hello World!"); assertThat(output).contains("World"); } }
@ExtendWith(OutputCaptureExtension::class) class MyOutputCaptureTests { @Test fun testName(output: CapturedOutput?) { println("Hello World!") assertThat(output).contains("World") } }
TestRestTemplate
TestRestTemplate
- bu Spring-dan RestTemplate
ga qulay alternativ bo'lib, u integratsiya testlari uchun foydali. Oddiy yoki asosiy HTTP autentifikatsiyani (foydalanuvchi nomi va parol bilan) jo'natadigan shablonni olish mumkin. Har qanday holatda shablon nosozliklarga chidamli. Ya'ni, uning ishlash logikasi test qilinishi uchun qulay va 4xx va 5xx xatoliklarida istisno holatlarni yaratmaydi. Buning o'rniga bunday xatolarni ResponseEntity
va uning holat kodiga qarab aniqlash mumkin.
WebTestClient
ni taqdim etadi, u WebFluxda ham integratsiya testlari uchun, ham WebFlux va MVCda "boshidan oxirigacha" testlar uchun mos.
TestRestTemplate
dan farqli o'laroq, bu tasdiqlarni qo'shish uchun tekis API taqdim etadi.
Apache HTTP Client (versiya 4.3.2 yoki undan yuqori) ishlatishni tavsiya qilinadi – lekin majburiy emas. Agar u sizning classpath-da bo'lsa, TestRestTemplate
shabloni bunga munosabat bildiradi va klientni tegishli ravishda sozlaydi. Agar Apache HTTP klientini ishlatsangiz, test qilish uchun ba'zi qo'shimcha funksiyalar qo'shiladi:
-
Yo'naltirishlar kuzatilmaydi (shuning uchun javob manziliga tasdiqlarni qo'shishingiz mumkin).
-
Cookie fayllar e'tiborga olinmaydi (shablon holatni saqlamaydi).
Integratsiya testlarida TestRestTemplate
ni to'g'ridan-to'g'ri yaratish 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
annotatsiyasini ishlatsangiz, to'liq sozlangan TestRestTemplate
ni injektsiya qilishingiz va uni ishlatishni boshlashingiz mumkin. Qo'shimcha sozlash kerak bo'lsa, uni RestTemplateBuilder
bilan amalga oshirish mumkin. Xost va porti ko'rsatilmagan URL-lar avtomatik ravishda ichki serverga ulanadi, quyidagi misolda ko'rsatilganidek:
@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