בודק אתחול האביב @ConfigurationProperties

1. סקירה כללית

במדריך הקודם שלנו ל @ConfigurationProperties, למדנו כיצד להגדיר ולהשתמש ב- @ConfigurationProperties הערה עם Spring Boot לעבודה עם תצורה חיצונית.

במדריך זה, נראה כיצד לבדוק שיעורי תצורה המסתמכים על ה- @ConfigurationProperties ביאור כדי לוודא שנתוני התצורה שלנו נטענים ומאוגדים כהלכה לשדות המתאימים שלהם.

2. תלות

בפרויקט Maven שלנו נשתמש ב- אביב-אתחול-מתנע ו מבחן אביב-אתחול-התחלה תלות כדי לאפשר את ה- API של מעיין הליבה ואת ממשק ה- API של Spring, בהתאמה:

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

בנוסף, בואו להגדיר את הפרויקט שלנו עם תלות באימות שעועית מכיוון שנשתמש בהם מאוחר יותר:

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

3. מאפיינים המחייבים POJOs המוגדרים על ידי המשתמש

כשעובדים עם תצורה חיצונית, אנו בדרך כלל יוצרים POJOs המכילים שדות התואמים את מאפייני התצורה התואמים. כפי שכבר ידוע, Spring יחייב אוטומטית את מאפייני התצורה לשיעורי Java שאנו יוצרים.

ראשית, נניח שיש לנו תצורת שרת מסוימת בתוך קובץ מאפיינים אליו נקרא src / test / resources / server-config-test.properties:

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

כעת, בואו נגדיר מחלקת תצורה פשוטה המתאימה לקובץ המאפיינים הקודם:

@Configuration @ConfigurationProperties (קידומת = "שרת") מעמד ציבורי ServerConfig {כתובת כתובת פרטית; משאבי מפה פרטיים Path; // גטרים וקובעים}

וגם המקביל כתובת סוּג:

כתובת בכיתה ציבורית {מחרוזת IP פרטית; // גטרים וקובעים}

לבסוף, בואו נזריק את ServerConfig POJO לשיעור הבדיקה שלנו וודא שכל שדותיו מוגדרים כהלכה:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = ServerConfig.class) @TestPropertySource ("classpath: server-config-test.properties") כיתה ציבורית BindingPropertiesToUserDefinedPOJOUnitTest {@Autowigired Server; @Test void givenUserDefinedPOJO_whenBindingPropertiesFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.1", serverConfig.getAddress (). GetIp ()); מפה expectResourcesPath = HashMap חדש (); expectResourcesPath.put ("imgs", "/ root / imgs"); assertEquals (expectResourcesPath, serverConfig.getResourcesPath ()); }}

במבחן זה השתמשנו בהערות הבאות:

  • @ExtendWith - משלב את מסגרת TestContext של אביב עם JUnit5
  • @EnableConfigurationProperties - מאפשר תמיכה עבור @ConfigurationProperties שעועית (במקרה זה, ServerConfig אפונה)
  • @TestPropertySource - מציין קובץ בדיקה העוקף את ברירת המחדל application.properties קוֹבֶץ

4. @ConfigurationProperties עַל @אפונה שיטות

דרך נוספת ליצור שעועית תצורה היא באמצעות @ConfigurationProperties ביאור ב @אפונה שיטות.

לדוגמא, הדברים הבאים getDefaultConfigs () שיטה יוצרת א ServerConfig שעועית תצורה:

@Configuration מחלקה ציבורית ServerConfigFactory {@Bean (name = "default_bean") @ConfigurationProperties (קידומת = "server.default") ציבורית ServerConfig getDefaultConfigs () {להחזיר ServerConfig חדש (); }}

כפי שאנו רואים, אנו מסוגלים להגדיר את ה- ServerConfig שימוש למשל @ConfigurationProperties על getDefaultConfigs () ללא צורך לערוך את ServerConfig הכיתה עצמה. זה יכול להיות מועיל במיוחד בעבודה עם מעמד חיצוני חיצוני שמגביל את הגישה.

לאחר מכן, נגדיר מאפיין חיצוני לדוגמה:

server.default.address.ip = 192.168.0.2

לבסוף, כדי לומר לאביב להשתמש ב- ServerConfigFactory בכיתה בעת טעינת ה- ApplicationContext (לפיכך, צור את שעועית התצורה שלנו), נוסיף את ה- @ContextConfiguration ביאור לשיעור המבחן:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = ServerConfig.class) @ContextConfiguration (classes = ServerConfigFactory.class) @TestPropertySource ("classpath: server-config-test.properties") class public BindingProperties @ default_bean ") ServerConfig פרטי ServerConfig; @Test בטל givenBeanAnnotatedMethod_whenBindingProperties_thenAllFieldsAreSet () {assertEquals ("192.168.0.2", serverConfig.getAddress (). GetIp ()); // קביעות אחרות ...}}

5. אימות מאפיינים

כדי לאפשר אימות שעועית באביב אתחול, עלינו להוסיף הערות למחלקה העליונה @ מאושר. לאחר מכן, אנו מוסיפים את הנדרש javax.validation אילוצים:

@Configuration @ConfigurationProperties (קידומת = "לאמת") @Validated Class Public MailServer {@NotNull @NotEmpty Map Map Properties Map; @Valid פרטי MailConfig mailConfig = MailConfig חדש (); // גטרים וקובעים}

באופן דומה, ה MailConfig בכיתה יש גם אילוצים:

מחלקה ציבורית MailConfig {@NotBlank @Email כתובת מחרוזת פרטית; // גטרים וקובעים}

על ידי מתן ערכת נתונים חוקית:

validate.propertiesMap.first = prop1 validate.propertiesMap.second = prop2 [מוגן בדוא"ל]

היישום יתחיל כרגיל ומבחני היחידות שלנו יעברו:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = MailServer.class) @TestPropertySource ("classpath: property-validation-test.properties") מחלקה ציבורית PropertyValidationUnitTest {@ שרת דואר שרת MailServer פרטי; מאפיין Validator סטטי פרטי Validator; @BeforeAll התקנת חלל סטטי ציבורית () {propertyValidator = Validation.buildDefaultValidatorFactory (). GetValidator (); } @Test בטל כאשר BindingPropertiesToValidatedBeans_thenConstrainsAreChecked () {assertEquals (0, propertyValidator.validate (mailServer.getPropertiesMap ()). Size ()); assertEquals (0, propertyValidator.validate (mailServer.getMailConfig ()). size ()); }}

מצד שני, אם אנו משתמשים במאפיינים לא חוקיים, אביב יזרוק IllegalStateException בהפעלה.

לדוגמה, באמצעות אחת מהתצורות הלא חוקיות האלה:

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

יגרום לכישלון היישום שלנו עם הודעת שגיאה זו:

מאפיין: validate.propertiesMap [second] ערך: סיבה: לא יכול להיות ריק מאפיין: validate.mailConfig.address ערך: user1.test סיבה: חייב להיות כתובת דוא"ל מעוצבת היטב

שים לב ש השתמשנו @תָקֵף על mailConfig שדה כדי להבטיח כי MailConfig מגבלות נבדקות, גם אם validate.mailConfig.address לא הוגדר. אחרת, האביב ישתקע mailConfig ל ריק והפעל את היישום כרגיל.

6. המרת נכסים

המרת מאפייני Spring Boot מאפשרת לנו להמיר מאפיינים מסוימים לסוגים ספציפיים.

בחלק זה נתחיל בבדיקת שיעורי תצורה המשתמשים בהמרה המובנית של Spring. לאחר מכן נבדוק ממיר מותאם אישית אותו אנו יוצרים בעצמנו.

6.1. המרת ברירת המחדל של Spring Boot

בואו ניקח בחשבון את המאפיינים הבאים של גודל ומשך הנתונים:

# גדלי נתונים convert.upload_speed = 500MB convert.download_speed = 10 # משך זמן convert.backup_day = 1d convert.backup_hour = 8

Spring Boot יחייב מאפיינים אלה באופן אוטומטי להתאמה DataSize ו מֶשֶׁך שדות מוגדר ב PropertyConversion מחלקת תצורה:

@Configuration @ConfigurationProperties (קידומת = "להמיר") מחלקה ציבורית PropertyConversion {DataSize פרטי uploadSpeed; @ DataSizeUnit (DataUnit.GIGABYTES) DataSize פרטי DownloadSpeed; משך זמן backupDay; @DurationUnit (ChronoUnit.HOURS) פרטי משך backupHour; // גטרים וקובעים}

עכשיו, בואו נבדוק את תוצאות ההמרה:

@ExtendWith (SpringExtension.class) @EnableConfigurationProperties (value = PropertyConversion.class) @ContextConfiguration (קלאסים = CustomCredentialsConverter.class) @TestPropertySource ("classpath: spring-conversion-test.properties") נכס ציבורי SpringPropertiesConversionConversion_Convert_Convert_Convert_Convert_Conversion_Conversion_Conversion_Converter = @Test בטל כאשרUsingSpringDefaultSizeConversion_thenDataSizeObjectIsSet () {assertEquals (DataSize.ofMegabytes (500), propertyConversion.getUploadSpeed ​​()); assertEquals (DataSize.ofGigabytes (10), propertyConversion.getDownloadSpeed ​​()); } @Test בטל כאשרUsingSpringDefaultDurationConversion_thenDurationObjectIsSet () {assertEquals (Duration.ofDays (1), propertyConversion.getBackupDay ()); assertEquals (Duration.ofHours (8), propertyConversion.getBackupHour ()); }}

6.2. ממירים מותאמים אישית

עכשיו בואו נדמיין שאנחנו רוצים להמיר את להמיר אישורים תכונה:

convert.credentials = משתמש, 123

להלן תְעוּדָה מעמד:

אישורי מחלקה ציבורית {שם משתמש מחרוזת פרטי; סיסמת מחרוזת פרטית; // גטרים וקובעים}

כדי להשיג זאת, אנו יכולים ליישם ממיר מותאם אישית:

@Component @ConfigurationProperties איגוד מחלקה ציבורית CustomCredentialsConverter מיישם ממיר {@Override אישורים ציבוריים להמיר (מקור מחרוזת) {String [] data = source.split (","); להחזיר אישורים חדשים (נתונים [0], נתונים [1]); }}

לסיום, בואו נוסיף a אישורים שדה ל PropertyConversion מעמד:

PropertyConversion ממעמד ציבורי {אישורי פרטי כניסה פרטיים; // ...}

בשלנו SpringPropertiesConversionUnitTest בכיתת מבחן, אנחנו גם צריכים להוסיף @ContextConfiguration כדי לרשום את הממיר המותאם אישית בהקשר של אביב:

// הערות אחרות @ContextConfiguration (מחלקות = CustomCredentialsConverter.class) מחלקה ציבורית SpringPropertiesConversionUnitTest {// ... @Test בטל כאשר רישום CustomCredentialsConverter_thenCredentialsAreParsed () {assertEquals ("משתמש", propertyConversion.getCred;). assertEquals ("123", propertyConversion.getCredentials (). getPassword ()); }}

כפי שעולה מהטענות הקודמות, אביב השתמש בממיר המותאם אישית שלנו כדי לנתח את להמיר אישורים נכס לתוך א אישורים למשל.

7. כריכת מסמכי YAML

עבור נתוני תצורה היררכיים, תצורת YAML יכולה להיות נוחה יותר. בנוסף, YAML תומך בהגדרת פרופילים מרובים בתוך אותו מסמך.

הבאים application.yml ממוקם תחת src / test / resources / מגדיר פרופיל "מבחן" עבור ה- ServerConfig מעמד:

קפיץ: פרופילים: שרת בדיקה: כתובת: ip: 192.168.0.4 resources_path: imgs: / etc / test / imgs --- # פרופילים אחרים

כתוצאה מכך המבחן הבא יעבור:

@ExtendWith (SpringExtension.class) @ContextConfiguration (initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties (value = ServerConfig.class) @ActiveProfiles ("test") מחלקה ציבורית שרת BindingYMLPropertiesUnitowTig = @ ServerConfiguration = @ ServerConfig; @Test בטל whenBindingYMLConfigFile_thenAllFieldsAreSet () {assertEquals ("192.168.0.4", serverConfig.getAddress (). GetIp ()); // קביעות אחרות ...}}

כמה הערות לגבי ההערות המשומשות:

  • @ContextConfiguration (אתחולים = ConfigFileApplicationContextInitializer.class) - טוען את application.yml קוֹבֶץ
  • @ActiveProfiles ("מבחן") - מציין שפרופיל "הבדיקה" ישמש במהלך בדיקה זו

לבסוף, בואו נזכור את זה לא זה ולא זה @ProperySource ולא @TestProperySource טעינת תמיכה .yml קבצים. לכן, עלינו תמיד למקם את תצורות ה- YAML שלנו בתוך ה- application.yml קוֹבֶץ.

8. עקיפה @ConfigurationProperties תצורות

לפעמים, אולי נרצה לעקוף את מאפייני התצורה שנטענו על ידי @ConfigurationProperties עם מערך נתונים אחר, במיוחד בעת בדיקה.

כפי שהראינו בדוגמאות הקודמות, נוכל להשתמש @TestPropertySource ("path_to_new_data_set") כדי להחליף את כל התצורה המקורית (תחת / src / main / resources) עם אחד חדש.

לחלופין, נוכל להחליף באופן סלקטיבי חלק מהמאפיינים המקוריים באמצעות נכסים תכונה של @TestPropertySource גם כן.

נניח שאנחנו רוצים לעקוף את ההגדרה הקודמת validate.mail_config.address נכס בעל ערך אחר. כל שעלינו לעשות הוא להוסיף הערות לשיעור הבדיקה שלנו @TestPropertySource ואז הקצה ערך חדש לאותו נכס באמצעות ה- נכסים רשימה:

@TestPropertySource (נכסים = {"[מוגן באמצעות דוא"ל]"})

כתוצאה מכך, אביב ישתמש בערך החדש שהוגדר:

assertEquals ("[email protected]", mailServer.getMailConfig (). getAddress ());

9. מסקנה

במדריך זה ראינו כיצד לבדוק סוגים שונים של שיעורי תצורה המשתמשים ב- @ConfigurationProperties ביאור לטעינה .נכסים ו .yml קבצי תצורה.

כרגיל, קוד המקור של מאמר זה זמין ב- GitHub.


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