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 ConfigurableApplicationContextga 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.
WebTestClientni taqdim etadi, u WebFluxda ham integratsiya testlari uchun, ham WebFlux va MVCda "boshidan oxirigacha" testlar uchun mos.
TestRestTemplatedan 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