JavaRush /Kurslar /All lectures for UZ purposes /Spring Boot ilovasini test qilish, 3-qism

Spring Boot ilovasini test qilish, 3-qism

All lectures for UZ purposes
Daraja , Dars
Mavjud

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:

Java
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; import org.springframework.test.context.ContextConfiguration; @ContextConfiguration(classes = Config.class, initializers = ConfigDataApplicationContextInitializer.class) class MyConfigFileTests { // ... } 
Kotlin
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer import org.springframework.test.context.ContextConfiguration @ContextConfiguration(classes = [Config::class], initializers = [ConfigDataApplicationContextInitializer::class]) class MyConfigFileTests { // ... } 
Faqatgina 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:

Java
import org.junit.jupiter.api.Test; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.mock.env.MockEnvironment; import static org.assertj.core.api.Assertions.assertThat; class MyEnvironmentTests { @Test void testPropertySources() { MockEnvironment environment = new MockEnvironment(); TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment); assertThat(environment.getProperty("name")).isEqualTo("Boot"); } } 
Kotlin
import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.boot.test.util.TestPropertyValues import org.springframework.mock.env.MockEnvironment 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:

Java
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(OutputCaptureExtension.class) class MyOutputCaptureTests { @Test void testName(CapturedOutput output) { System.out.println("Hello World!"); assertThat(output).contains("World"); } } 
Kotlin
import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.boot.test.system.CapturedOutput import org.springframework.boot.test.system.OutputCaptureExtension @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.

Spring Framework 5.0 yangi 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:

Java
import org.junit.jupiter.api.Test; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; 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"); } } 
Kotlin
import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.boot.test.web.client.TestRestTemplate 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:

Java
import java.time.Duration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpHeaders; import static org.assertj.core.api.Assertions.assertThat; @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)); } } } 
Kotlin
import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.SpringBootTest.WebEnvironment import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.test.web.client.TestRestTemplate import org.springframework.boot.web.client.RestTemplateBuilder import org.springframework.context.annotation.Bean import java.time.Duration @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)) } } } 
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION