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.