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.