Testuje sa jarné zavádzanie @ConfigurationProperties

1. Prehľad

V našom predchádzajúcom sprievodcovi po @ConfigurationProperties, naučili sme sa, ako nastaviť a používať @ConfigurationProperties anotácia s Spring Boot pre prácu s externou konfiguráciou.

V tomto návode ukážeme si, ako otestovať konfiguračné triedy, ktoré sa spoliehajú na @ConfigurationProperties anotácia aby sme sa uistili, že naše konfiguračné údaje sú načítané a správne viazané na príslušné polia.

2. Závislosti

V našom projekte Maven použijeme štartér s pružinou a test štartovacej pružiny závislosti na povolení API základnej pružiny a Spring's test API, v uvedenom poradí:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter org.springframework.boot test pružiny-boot-štartéra 

Poďme si tiež nakonfigurovať náš projekt so závislosťami overenia fazule, pretože ich použijeme neskôr:

  org.hibernate hibernate-validator javax.el javax.el-api 3.0.0 org.glassfish.web javax.el 2.2.6 

3. Vlastnosti viazané na POJO definované používateľom

Pri práci s externalizovanou konfiguráciou typicky vytvárame POJO obsahujúce polia, ktoré zodpovedajú zhodným vlastnostiam konfigurácie. Ako už vieme, Spring potom automaticky naviaže vlastnosti konfigurácie na triedy Java, ktoré vytvoríme.

Na začiatok predpokladajme, že v súbore vlastností, ktorý zavoláme, máme konfiguráciu servera src / test / resources / server-config-test.properties:

server.address.ip = 192.168.0.1 server.resources_path.imgs = / root / imgs

Teraz definujme jednoduchú konfiguračnú triedu zodpovedajúcu predchádzajúcemu súboru vlastností:

@Configuration @ConfigurationProperties (prefix = "server") verejná trieda ServerConfig {adresa súkromnej adresy; súkromná mapa resourcesPath; // zakladatelia a zakladatelia}

a tiež zodpovedajúce Adresa typ:

public class Adresa {private String ip; // zakladatelia a zakladatelia}

Nakoniec vpichneme ServerConfig POJO do našej testovacej triedy a overte, či sú všetky jeho polia nastavené správne:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = ServerConfig.class) @TestPropertySource ("classpath: server-config-test.properties") verejná trieda BindingPropertiesToUserDefinedPOJOUnitTest {@Autowired private ServerConfig; @Test void givenUserDefinedPOJO_whenBindingPropertiesFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.1", serverConfig.getAddress (). GetIp ()); Mapa expectResourcesPath = nový HashMap (); expectResourcesPath.put ("imgs", "/ root / imgs"); assertEquals (expectResourcesPath, serverConfig.getResourcesPath ()); }}

V tomto teste sme použili nasledujúce anotácie:

  • @ExtendWith - integruje Spring's TestContext framework s JUnit5
  • @EnableConfigurationProperties - umožňuje podporu pre @ConfigurationProperties fazuľa (v tomto prípade ServerConfig fazuľa)
  • @TestPropertySource - určuje testovací súbor, ktorý prepíše predvolené application.properties spis

4. @ConfigurationProperties na @Bean Metódy

Ďalším spôsobom, ako vytvoriť konfiguračné fazule, je použitie súboru @ConfigurationProperties anotácia dňa @Bean metódy.

Napríklad nasledujúce getDefaultConfigs () metóda vytvára a ServerConfig konfiguračná fazuľa:

@Configuration public class ServerConfigFactory {@Bean (name = "default_bean") @ConfigurationProperties (prefix = "server.default") public ServerConfig getDefaultConfigs () {return new ServerConfig (); }}

Ako vidíme, sme schopní nakonfigurovať ServerConfig napríklad pomocou @ConfigurationProperties na getDefaultConfigs () metódou bez toho, aby ste museli upravovať ServerConfig samotná trieda. To môže byť obzvlášť užitočné pri práci s externou triedou tretej strany, ktorá má obmedzený prístup.

Ďalej definujeme vzorovú externú vlastnosť:

server.default.address.ip = 192.168.0.2

Nakoniec povedzte Springovi, aby použil ServerConfigFactory triedy pri načítaní ApplicationContext (preto vytvoríme našu konfiguračnú fazuľu), pridáme @ContextConfiguration anotácia k testovacej triede:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = ServerConfig.class) @ContextConfiguration (classes = ServerConfigFactory.class) @TestPropertySource ("classpath: server-config-test.properties") verejná trieda BindingPropertiesToBindingPropertiesTo default_bean ") private ServerConfig serverConfig; @Test void givenBeanAnnotatedMethod_whenBindingProperties_thenAllFieldsAreSet () {assertEquals ("192.168.0.2", serverConfig.getAddress (). GetIp ()); // ďalšie tvrdenia ...}}

5. Validácia vlastností

Ak chcete povoliť overenie fazule v Spring Boot, musíme anotovať triedu najvyššej úrovne @Overené. Potom pridáme požadované javax.validation obmedzenia:

@Configuration @ConfigurationProperties (prefix = "overiť") @Validated public class MailServer {@NotNull @NotEmpty private Map propertiesMap; @Valid private MailConfig mailConfig = nový MailConfig (); // zakladatelia a zakladatelia}

Podobne MailConfig trieda má tiež určité obmedzenia:

verejná trieda MailConfig {@NotBlank @Email súkromná adresa reťazca; // zakladatelia a zakladatelia}

Poskytnutím platného súboru údajov:

validate.propertiesMap.first = prop1 validate.propertiesMap.second = prop2 [chránený e-mailom]

aplikácia sa spustí normálne a naše jednotkové testy vyhovejú:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = MailServer.class) @TestPropertySource ("classpath: property-validation-test.properties") verejná trieda PropertyValidationUnitTest {@Autowired private MailServer mailServer; private static Validator propertyValidator; @BeforeAll public static void setup () {propertyValidator = Validation.buildDefaultValidatorFactory (). GetValidator (); } @Test void whenBindingPropertiesToValidatedBeans_thenConstrainsAreChecked () {assertEquals (0, propertyValidator.validate (mailServer.getPropertiesMap ()). Size ()); assertEquals (0, propertyValidator.validate (mailServer.getMailConfig ()). size ()); }}

Na druhej strane, ak použijeme neplatné vlastnosti, Spring hodí IllegalStateException pri štarte.

Napríklad pomocou ktorejkoľvek z týchto neplatných konfigurácií:

validate.propertiesMap.second = validate.mail_config.address = user1.test

spôsobí zlyhanie našej aplikácie s touto chybovou správou:

Vlastnosť: validate.propertiesMap [druhá] Hodnota: Dôvod: nesmie byť prázdny Vlastnosť: validate.mailConfig.address Hodnota: user1.test Dôvod: musí byť správne tvarovaná e-mailová adresa

Všimni si sme použili @ Platné na mailConfig oblasti zabezpečiť, aby MailConfig obmedzenia sú skontrolované, aj keď validate.mailConfig.address nebol definovaný. Inak by nastala jar mailConfig do nulový a spustiť aplikáciu normálne.

6. Konverzia vlastností

Konverzia vlastností Spring Boot nám umožňuje prevádzať niektoré vlastnosti do konkrétnych typov.

V tejto časti začneme testovaním konfiguračných tried, ktoré používajú integrovanú konverziu Spring. Potom otestujeme vlastný prevodník, ktorý sme si sami vytvorili.

6.1. Predvolená konverzia Spring Boot

Zvážme nasledujúce vlastnosti veľkosti a trvania údajov:

# veľkosti dát convert.upload_speed = 500 MB convert.download_speed = 10 # trvanie convert.backup_day = 1d convert.backup_hour = 8

Spring Boot automaticky spojí tieto vlastnosti so zodpovedajúcimi DataSize a Trvanie polia definované v PropertyConverzia konfiguračná trieda:

@Configuration @ConfigurationProperties (prefix = "prevádzať") verejná trieda PropertyConversion {private DataSize uploadSpeed; @DataSizeUnit (DataUnit.GIGABYTES) súkromná DataSize downloadSpeed; private Duration backupDay; @DurationUnit (ChronoUnit.HOURS) súkromné ​​trvanie backupHour; // zakladatelia a zakladatelia}

Teraz skontrolujme výsledky konverzie:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = PropertyConversion.class) @ContextConfiguration (classes = CustomCredentialsConverter.class) @TestPropertySource ("classpath: spring-conversion-test.properties") verejná trieda SpringPropertiesCt @Test void whenUsingSpringDefaultSizeConversion_thenDataSizeObjectIsSet () {assertEquals (DataSize.ofMegabytes (500), propertyConversion.getUploadSpeed ​​()); assertEquals (DataSize.ofGigabytes (10), propertyConversion.getDownloadSpeed ​​()); } @Test void whenUsingSpringDefaultDurationConversion_thenDurationObjectIsSet () {assertEquals (Duration.ofDays (1), propertyConversion.getBackupDay ()); assertEquals (Duration.ofHours (8), propertyConversion.getBackupHour ()); }}

6.2. Vlastné prevádzače

Teraz si predstavme, že chceme prevádzať konvertovať. poverenia nehnuteľnosť:

convert.credentials = užívateľ, 123

do nasledujúcich Poverovacie listiny trieda:

public class Credentials {private String username; súkromné ​​reťazcové heslo; // zakladatelia a zakladatelia}

Aby sme to dosiahli, môžeme implementovať vlastný prevodník:

@Component @ConfigurationPropertiesBinding verejná trieda CustomCredentialsConverter implementuje Converter {@Override public Credentials convert (zdroj reťazca) {String [] data = source.split (","); vrátiť nové poverenia (údaje [0], údaje [1]); }}

Na záver pridajme a Poverovacie listiny pole do PropertyConverzia trieda:

public class PropertyConversion {private Credentials credentials; // ...}

V našom SpringPropertiesConversionUnitTest testovacej triedy, musíme tiež pridať @ContextConfiguration zaregistrovať vlastný prevodník v jarnom kontexte:

// ďalšie anotácie @ContextConfiguration (classes = CustomCredentialsConverter.class) verejná trieda SpringPropertiesConversionUnitTest {// ... @Test void whenRegisteringCustomCredentialsConverter_thenCredentialsAreParsed () {assertEquals ("user", propertyConversion.get) assertEquals ("123", propertyConversion.getCredentials (). getPassword ()); }}

Ako ukazujú predchádzajúce tvrdenia, Spring použila náš vlastný prevodník na analýzu súboru konvertovať. poverenia majetok do a Poverovacie listiny inštancia.

7. Viazanie dokumentov YAML

Pre hierarchické konfiguračné údaje by mohla byť pohodlnejšia konfigurácia YAML. YAML navyše podporuje definovanie viacerých profilov v rovnakom dokumente.

Nasledujúci aplikácia.yml umiestnené pod src / test / zdroje / definuje "testovací" profil pre ServerConfig trieda:

jar: profily: testovací server: adresa: ip: 192.168.0.4 cesta_zdrojov: imgs: / etc / test / imgs --- # ďalšie profily

Výsledkom bude nasledujúci test:

@ExtendWith (SpringExtension.class) @ContextConfiguration (initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties (value = ServerConfig.class) @ActiveProfiles ("test") verejná trieda BindingYMLPropertiesUnitTest {@Autowired; @Test void whenBindingYMLConfigFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.4", serverConfig.getAddress (). GetIp ()); // ďalšie tvrdenia ...}}

Pár poznámok k použitým anotáciám:

  • @ContextConfiguration (initializers = ConfigFileApplicationContextInitializer.class) - načíta aplikácia.yml spis
  • @ActiveProfiles („test“) - určuje, že počas tohto testu sa použije profil „test“

Nakoniec si to uvedomme ani jedno @ProperySource ani @TestProperySource podpora načítania .yml súbory. Preto by sme mali vždy umiestniť naše konfigurácie YAML do aplikácia.yml spis.

8. prvoradé @ConfigurationProperties Konfigurácie

Niekedy môžeme chcieť prepísať vlastnosti konfigurácie načítané pomocou @ConfigurationProperties s iným súborom údajov, najmä pri testovaní.

Ako sme si ukázali v predchádzajúcich príkladoch, môžeme použiť @TestPropertySource („path_to_new_data_set“) nahradiť celú pôvodnú konfiguráciu (pod / src / main / resources) s novým.

Prípadne by sme mohli selektívne nahradiť niektoré z pôvodných vlastností pomocou znaku vlastnosti atribút @TestPropertySource tiež.

Predpokladajme, že chceme prekonať predtým definované validate.mail_config.address majetok s inou hodnotou. Musíme len anotovať našu testovaciu triedu @TestPropertySource a potom priradiť novú hodnotu tej istej vlastnosti cez vlastnosti zoznam:

@TestPropertySource (properties = {"[chránený e-mailom]"})

V dôsledku toho použije jar novo definovanú hodnotu:

assertEquals ("[chránený e-mailom]", mailServer.getMailConfig (). getAddress ());

9. Záver

V tomto tutoriáli sme videli, ako testovať rôzne typy konfiguračných tried, ktoré využívajú @ConfigurationProperties anotácia na načítanie .vlastnosti a .yml konfiguračné súbory.

Ako obvykle je zdrojový kód tohto článku k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found