מדריך ל- ReflectionTestUtils לבדיקת יחידות

1. הקדמה

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

במדריך זה, נבחן כיצד אנו יכולים להשתמש ב- ReflectionTestUtils בבדיקת יחידות באמצעות כמה דוגמאות.

2. תלות Maven

נתחיל בהוספת הגרסאות העדכניות ביותר של כל התלות הדרושה לצורך הדוגמאות שלנו pom.xml:

 org.springframework spring-context 5.1.2.RELEASE org.springframework spring-test 5.1.2. RELEASE test 

האחרון אביב-הקשר, אביב-מבחן ניתן להוריד תלות ממאגר Maven Central.

3. שימוש ReflectionTestUtils לקביעת ערך של שדה שאינו ציבורי

נניח שעלינו להשתמש במופע של כיתה שיש לה שדה פרטי ללא שיטת קובע ציבורי במבחן היחידה שלנו.

נתחיל ביצירתו:

עובד בכיתה ציבורית {מזהה שלם פרטי; שם מחרוזת פרטי; // סטנדרטים / סטרים סטנדרטיים}

בדרך כלל איננו יכולים לגשת לשדה הפרטי תְעוּדַת זֶהוּת להקצות ערך לבדיקה מכיוון שאין עבורו שיטת קובע ציבורי.

לאחר מכן נוכל להשתמש ReflectionTestUtils.setField שיטה להקצות ערך לחבר הפרטי תְעוּדַת זֶהוּת:

@Test הציבור בטל כאשרNonPublicField_thenReflectionTestUtilsSetField () {עובד שכיר = עובד חדש (); ReflectionTestUtils.setField (עובד, "id", 1); assertTrue (עובד. getId (). שווה (1)); }

4. שימוש ReflectionTestUtils להפעיל שיטה לא ציבורית

בואו נדמיין שיש לנו שיטה פרטית עובדטרינג ב עוֹבֵד מעמד:

עובד מחרוזת פרטיToString () {return "id:" + getId () + "; name:" + getName (); }

אנו יכולים לכתוב מבחן יחידה עבור ה- עובדטרינג שיטה כמפורט להלן, למרות שאין לה גישה מחוץ ל- עוֹבֵד מעמד:

@ מבחן ציבורי בטל כאשר NonPublicMethod_thenReflectionTestUtilsInvokeMethod () {עובד שכיר = עובד חדש (); ReflectionTestUtils.setField (עובד, "id", 1); employee.setName ("סמית ', ג'ון"); assertTrue (ReflectionTestUtils.invokeMethod (עובד, "עובדToString"). שווה ("id: 1; שם: סמית ', ג'ון")); }

5. שימוש ReflectionTestUtils להזריק תלות

נניח שרוצים לכתוב מבחן יחידה לרכיב האביב הבא שיש שדה פרטי עם ה- @Autowired ביאור:

@Component בכיתה ציבורית EmployeeService {@ HRService שירות פרטי פרטי; מחרוזת ציבורי findEmployeeStatus (מספר עובד שלם) {להחזיר "שכיר" + עובד עובד + ":" + hrService.getEmployeeStatus (עובדId); }}

כעת אנו יכולים ליישם את שירות HRS רכיב להלן:

@ רכיב ציבורי רכיב HRService {ציבורי מחרוזת getEmployeeStatus (מספר עובד שלם) {להחזיר "לא פעיל"; }}

יתר על כן, בואו ליצור יישום מדומה עבור שירות HRS בכיתה באמצעות Mockito. נזריק את הלעג הזה ל שירות עובדים למשל, ונשתמש בו במבחן היחידה שלנו:

HRService hrService = מדומה (HRService.class); כאשר (hrService.getEmployeeStatus (עובד.גיט ())). ואז החזרה ("פעיל");

כי hrService הוא תחום פרטי ללא מגדיר ציבורי, נשתמש בו ReflectionTestUtils.setField שיטה להזריק את הלעג שיצרנו לעיל לשדה פרטי זה.

EmployeeService employeeService = EmployeeService חדש (); ReflectionTestUtils.setField (עובד שירות, "hrService", hrService);

לבסוף, מבחן היחידות שלנו ייראה דומה לזה:

@Test ציבורי בטל כאשר InjectingMockOfDependency_thenReflectionTestUtilsSetField () {עובד שכיר = עובד חדש (); ReflectionTestUtils.setField (עובד, "id", 1); employee.setName ("סמית ', ג'ון"); HRService hrService = מדומה (HRService.class); כאשר (hrService.getEmployeeStatus (עובד.גיט ())). ואז החזרה ("פעיל"); EmployeeService employeeService = EmployeeService חדש (); // הזריק דמה לשדה הפרטי ReflectionTestUtils.setField (עובד שירות, "hrService", hrService); assertEquals ("עובד" + עובד.גט איד () + "סטטוס: פעיל", עובדשירות.findEmployeeStatus (עובד.גטיד ())); }

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

6. מסקנה

במדריך זה הראינו כיצד להשתמש ReflectionTestUtils בבדיקת יחידות באמצעות כמה דוגמאות.

דוגמאות קוד, כמו תמיד, ניתן למצוא באתר Github.


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