JavaRush /Kurslar /All lectures for UZ purposes /Testlash uchun vositalar

Testlash uchun vositalar

All lectures for UZ purposes
Daraja, Dars
Mavjud

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:

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 { // ... } 
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:

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, 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:

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("Assalomu alaykum, Dunyo!"); assertThat(output).contains("Dunyo"); } } 
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("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.

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

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 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:

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