A tavaszi rendszerindítás tesztelése @ConfigurationProperties

1. Áttekintés

Korábbi útmutatónk a @ConfigurationProperties, megtanultuk, hogyan kell beállítani és használni a @ConfigurationProperties annotáció a Spring Boot-tal a külső konfigurációval való munkavégzéshez.

Ebben az oktatóanyagban megmutatjuk, hogyan kell tesztelni a konfigurációs osztályokat, amelyek a @ConfigurationProperties annotáció győződjön meg arról, hogy a konfigurációs adataink megfelelően vannak betöltve és a megfelelő mezőkhöz vannak kötve.

2. Függőségek

Maven projektünkben a rugós-bakancs-indító és tavasz-csomagtartó-indító-teszt függőségek az alaprugós API és a Spring teszt API engedélyezéséhez:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test teszt 

Konfiguráljuk a projektünket babellenőrzési függőségekkel is, mivel később felhasználjuk őket:

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

3. Tulajdonságok a felhasználó által definiált POJO-khoz

Ha külső konfigurációval dolgozik, tipikusan POJO-kat hozunk létre, amelyek olyan mezőket tartalmaznak, amelyek megfelelnek a megfelelő konfigurációs tulajdonságoknak. Mint már tudjuk, a Spring ezután automatikusan hozzákapcsolja a konfigurációs tulajdonságokat az általunk létrehozott Java osztályokhoz.

Először tegyük fel, hogy van egy szerver-konfigurációnk egy tulajdonságfájlban, amelyet felhívunk src / test / resources / server-config-test.properties:

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

Most definiáljunk egy egyszerű konfigurációs osztályt, amely megfelel az előző tulajdonságfájlnak:

@Configuration @ConfigurationProperties (prefix = "server") public class ServerConfig {private Address address; privát Térkép-forrásokPath; // szerelők és beállítók}

és a megfelelőt is Cím típus:

public class Cím {private String ip; // szerelők és beállítók}

Végül adjuk be az ServerConfig POJO a tesztosztályunkba, és ellenőrizze, hogy minden mezője megfelelően van-e beállítva:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = ServerConfig.class) @TestPropertySource ("classpath: server-config-test.properties") public class BindingPropertiesToUserDefinedPOJOUnitTest {@AfowFun Server; @Test void givenUserDefinedPOJO_whenBindingPropertiesFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.1", serverConfig.getAddress (). GetIp ()); Térkép várhatóResourcesPath = új HashMap (); várhatóResourcesPath.put ("imgs", "/ root / imgs"); assertEquals (várhatóResourcesPath, serverConfig.getResourcesPath ()); }}

Ebben a tesztben a következő jegyzeteket használtuk:

  • @ExtendWith - integrálja a Spring TestContext keretrendszerét a JUnit5-tel
  • @EnableConfigurationProperties - lehetővé teszi a @ConfigurationProperties bab (ebben az esetben a ServerConfig bab)
  • @TestPropertySource - meghatároz egy tesztfájlt, amely felülírja az alapértelmezettet alkalmazás.tulajdonságok fájl

4. @ConfigurationProperties tovább @Bab Mód

A konfigurációs bab létrehozásának másik módja a @ConfigurationProperties felirat bekapcsolva @Bab mód.

Például a következők getDefaultConfigs () módszer létrehozza a ServerConfig konfigurációs bab:

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

Mint láthatjuk, képesek vagyunk konfigurálni a ServerConfig példány használatával @ConfigurationProperties a getDefaultConfigs () metódust, anélkül, hogy a ServerConfig osztály maga. Ez különösen hasznos lehet, ha külső, külső hozzáférésű osztályokkal dolgozunk.

Ezután határozzunk meg egy minta külső tulajdonságot:

server.default.address.ip = 192.168.0.2

Végül mondd meg Springnek, hogy használja a ServerConfigFactory osztály a ApplicationContext (ezért hozza létre a konfigurációs komponensünket), hozzáadjuk a @ContextConfiguration kommentár a tesztosztályhoz:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (érték = ServerConfig.class) @ContextConfiguration (osztály = ServerConfigFactory.class) @TestPropertySource ("classpath: server-config-test.properties" (@TestSubTowerTeanTat} default_bean ") privát ServerConfig serverConfig; @Test void givenBeanAnnotatedMethod_whenBindingProperties_thenAllFieldsAreSet () {assertEquals ("192.168.0.2", serverConfig.getAddress (). GetIp ()); // egyéb állítások ...}}

5. Tulajdonságok ellenőrzése

A babellenőrzés engedélyezéséhez a Spring Boot alkalmazásban a legfelsõbb osztályt kell jelölnünk @Validated. Ezután hozzáadjuk a szükségeset javax.validálás korlátok:

@Configuration @ConfigurationProperties (prefix = "validate") @Validated public class MailServer {@NotNull @NotEmpty private Map propertiesMap; @Valid private MailConfig mailConfig = new MailConfig (); // szerelők és beállítók}

Hasonlóképpen a MailConfig osztálynak vannak bizonyos korlátai is:

public class MailConfig {@NotBlank @Email private String cím; // szerelők és beállítók}

Érvényes adatkészlet megadásával:

validate.propertiesMap.first = prop1 validate.propertiesMap.second = prop2 [e-mail védett]

az alkalmazás normálisan indul, és az egység tesztjeink sikeresek lesznek:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = MailServer.class) @TestPropertySource ("classpath: property-validation-test.properties") public class PropertyValidationUnitTest {@Autowired private MailServer mailServer; privát statikus 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 ()); }}

Másrészről, ha érvénytelen tulajdonságokat használunk, a Spring egy IllegalStateException induláskor.

Például az alábbi érvénytelen konfigurációk bármelyikével:

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

alkalmazásunkat meghiúsítja, ezzel a hibaüzenettel:

Tulajdonság: validate.propertiesMap [második] Érték: Ok: nem lehet üres Tulajdonság: validate.mailConfig.address Érték: user1.test Ok: jól formázott e-mail címnek kell lennie

Figyelje meg használtuk @Érvényes a mailConfig mező annak biztosítására, hogy a MailConfig a korlátokat ellenőrizzük, még akkor is, ha validate.mailConfig.address nem volt meghatározva. Ellenkező esetben Spring beállítaná mailConfig nak nek nulla és indítsa el az alkalmazást rendesen.

6. Tulajdonságok átalakítása

A tavaszi rendszerindítási tulajdonságok átalakítása lehetővé teszi számunkra, hogy egyes tulajdonságokat meghatározott típusokká alakítsunk át.

Ebben a részben a konfiguráció osztályainak tesztelésével kezdjük, amelyek a Spring beépített konverzióját használják. Ezután tesztelünk egy saját átalakítót, amelyet mi magunk hozunk létre.

6.1. A Spring Boot alapértelmezett konverziója

Vegyük figyelembe a következő adatméret és időtartam tulajdonságokat:

# adatméret convert.upload_speed = 500MB convert.download_speed = 10 # időtartam convert.backup_day = 1d convert.backup_hour = 8

A Spring Boot automatikusan hozzákapcsolja ezeket a tulajdonságokat az egyezéshez DataSize és Időtartam mezők meghatározta a PropertyConversion konfigurációs osztály:

@Configuration @ConfigurationProperties (prefix = "convert") public class PropertyConversion {private DataSize uploadSpeed; @DataSizeUnit (DataUnit.GIGABYTES) privát DataSize downloadSpeed; privát Időtartam backupDay; @DurationUnit (ChronoUnit.HOURS) privát Időtartam backupHour; // szerelők és beállítók}

Most ellenőrizzük a konverziós eredményeket:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (érték = PropertyConversion.class) @ContextConfiguration (class = CustomCredentialsConverter.class) @TestPropertySource ("classpath: spring-conversion-test.properties"; PublicTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationTranslationComment @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. Egyedi átalakítók

Most képzeljük el, hogy a konvertálja.tanúsítványokat ingatlan:

convert.credentials = felhasználó, 123

a következőkbe Hitelesítő adatok osztály:

public class Hitelesítő adatok {private String felhasználónév; privát karakterlánc jelszó; // szerelők és beállítók}

Ennek megvalósításához megvalósíthatunk egy egyedi átalakítót:

@Component @ConfigurationPropertiesBinding public class CustomCredentialsConverter implementálja a Converter {@Override public Credentials convert (String source) {String [] data = source.split (","); adja vissza az új hitelesítő adatokat (adatok [0], adatok [1]); }}

Végül tegyünk hozzá egy Hitelesítő adatok mezőt a PropertyConversion osztály:

public class PropertyConversion {private Credentials hitelesítő adatok; // ...}

Miénkben SpringPropertiesConversionUnitTest teszt osztály, azt is hozzá kell tennünk @ContextConfiguration az egyéni átalakító regisztrálásához Spring kontextusában:

// egyéb megjegyzések @ContextConfiguration (class = CustomCredentialsConverter.class) public class SpringPropertiesConversionUnitTest {// ... @Test void whenRegisteringCustomCredentialsConverter_thenCredentialsAreParsed () {assertEquals ("user", propertyConversion.get; assertEquals ("123", propertyConversion.getCredentials (). getPassword ()); }}

Ahogy az előző állítások mutatják, A Spring az egyedi átalakítónk segítségével elemezte a konvertálja.tanúsítványokat ingatlan egy Hitelesítő adatok példa.

7. YAML Dokumentumok Kötés

Hierarchikus konfigurációs adatok esetén a YAML konfiguráció kényelmesebb lehet. Ezenkívül a YAML támogatja több profil definiálását ugyanazon dokumentumon belül.

A következő alkalmazás.yml alatt található src / test / resources / meghatározza a „teszt” profilt a ServerConfig osztály:

tavasz: profilok: teszt szerver: cím: ip: 192.168.0.4 erőforrások_útvonal: imgs: / etc / test / imgs --- # egyéb profilok

Ennek eredményeként a következő teszt sikeres lesz:

@ExtendWith (SpringExtension.class) @ContextConfiguration (inicializátorok = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties (érték = ServerConfig.class) @ActiveProfiles ("teszt") nyilvános osztály BindingYMLProperConfonTerverCustomFunterTerverCustomerFunTerverConfigureTerverCustomerFunTerverConfigureTerverCenterFunTerverConfigureServerConfigureConfigureConfigureConfigureConfigureConfigureConfigureConfigureServerConfigureTerverUnitTestConfigureServerConfigureServerConfigureServerConfigureServerConfigureServerConfigureServerCenter @Test void whenBindingYMLConfigFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.4", serverConfig.getAddress (). GetIp ()); // egyéb állítások ...}}

Néhány megjegyzés a használt kommentárokkal kapcsolatban:

  • @ContextConfiguration (inicializátorok = ConfigFileApplicationContextInitializer.class) - betölti a alkalmazás.yml fájl
  • @ActiveProfiles („teszt”) - meghatározza, hogy a teszt során a „teszt” profilt kell használni

Végül tartsuk szem előtt ezt se @ProperySource sem @TestProperySource támogatja a betöltést .yml fájlokat. Ezért mindig a YAML konfigurációinkat kell elhelyeznünk a alkalmazás.yml fájl.

8. Felülbírálás @ConfigurationProperties Konfigurációk

Előfordulhat, hogy felül akarjuk írni a @ConfigurationProperties más adatsorral, különösen teszteléskor.

Ahogy az előző példákban bemutattuk, használhatjuk @TestPropertySource ("elérési út_új_adat_készlet") a teljes eredeti konfiguráció cseréjéhez (alatt / src / main / resources) egy úttal.

Alternatív megoldásként szelektíven cserélhetnénk az eredeti tulajdonságok egy részét a tulajdonságait attribútuma @TestPropertySource is.

Tegyük fel, hogy felül akarjuk írni a korábban definiáltakat validate.mail_config.address tulajdonság egy másik értékkel. Csak annyit kell tennünk, hogy a tesztosztályunkat feljegyezzük @TestPropertySource majd hozzárendel egy új értéket ugyanahhoz a tulajdonsághoz a tulajdonságait lista:

@TestPropertySource (tulajdonságok = {"[e-mail védett]"})

Következésképpen Spring az újonnan definiált értéket fogja használni:

assertEquals ("[e-mail védett]", mailServer.getMailConfig (). getAddress ());

9. Következtetés

Ebben az oktatóanyagban láthattuk, hogyan tesztelhetünk különböző típusú konfigurációs osztályokat, amelyek a @ConfigurationProperties annotation to load .tulajdonságok és .yml konfigurációs fájlok.

Szokás szerint a cikk forráskódja elérhető a GitHubon.