Mockito ArgumentMatchers

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

מדריך זה מראה כיצד להשתמש ב- ArgumentMatcher ואיך זה שונה מה- ArgumentCaptor.

לקבלת מבוא למסגרת Mockito, עיין במאמר זה.

2. תלות Maven

עלינו להוסיף חפץ יחיד:

 מבחן org.mockito mockito-core 2.21.0 

הגרסה האחרונה של מוקיטו ניתן למצוא ב מייבן סנטרל.

3. ArgumentMatchers

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

doReturn ("פרח"). כאשר (flowerService) .נתח ("פרג");

בדוגמה לעיל, חוּט "פרח" מוחזר רק כאשר שירות הניתוח מקבל את חוּט "פָּרָג".

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

בכל התרחישים האלה, אנחנו יכולים להגדיר את השיטות הלעגיות שלנו עם טַעֲנָהשידוכים:

כאשר (flowerService.analyze (anyString ())). ואז החזר ("פרח");

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

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

דוגמה הבאה היא גישה שגויה לכך:

מחלקה מופשטת FlowerService {בוליאני מופשט ציבורי isABigFlower (שם מחרוזת, עלי כותרת); } דמה של FlowerService = דמה (FlowerService.class); כאשר (mock.isABigFlower ("פרג", anyInt ())). ואז החזר (נכון);

כדי לתקן את זה ולשמור על חוּט נקרא "פרג" כרצונו, נשתמש בו התאמת eq:

כאשר (mock.isABigFlower (eq ("פרג"), anyInt ())). ואז החזר (נכון);

יש שתי נקודות נוספות שכדאי לטפל בהן שידוכים משומשים:

  • איננו יכולים להשתמש בהם כערך החזר, נדרש ערך מדויק בעת נידוף שיחות
  • סוף כל סוף, איננו יכולים להשתמש בוויכוח שידוכים מחוץ לאימות או לדקירה

במקרה האחרון, מוקיטו יאתר את הוויכוח שלא במקומו ויזרוק InvalidUseOfMatchersException.

דוגמה רעה יכולה להיות:

String orMatcher = or (eq ("poppy"), endsWith ("y")); אמת (מדומה) .analyze (או Matcher);

הדרך ליישם את הקוד שלעיל היא:

אמת (מדומה) .analyze (או (eq ("פרג"), endsWith ("y")));

מוקיטו גם מספק תואמים נוספים ליישם פעולות לוגיות נפוצות ('לא', 'ו', 'או') ב ArgumentMatchers שתואמים סוגים פרימיטיביים וגם לא פרימיטיביים:

אמת (מדומה) .analyze (או (eq ("פרג"), endsWith ("y")));

4. התאמת ארגומנטים בהתאמה אישית

יוצר שֶׁלָנוּ שידוך יכול להיות טוב לבחור את הגישה הטובה ביותר האפשרית עבור תרחיש נתון ולהפיק מבחן באיכות הגבוהה ביותר, שהוא נקי ומתוחזק.

למשל, יכול להיות שיש לנו MessageController שמעביר מסרים. זה יקבל MessageDTOומתוך כך זה ייצור הוֹדָעָה שיועבר על ידי MessageService.

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

אמת (messageService, זמנים (1)). deliverMessage (כל (Message.class));

כי ה הוֹדָעָה נבנה בתוך השיטה הנבדקת, אנו נאלצים להשתמש כל כמו שידוך.

גישה זו אינה מאפשרת לנו לאמת את הנתונים בתוך ה- הוֹדָעָה, שיכולים להיות שונים בהשוואה לנתונים שבפנים MessageDTO.

מסיבה זו, אנו מיישמים התאמת ארגומנטים מותאמת אישית:

מחלקה ציבורית MessageMatcher מיישמת את ArgumentMatcher {הודעה פרטית נותרה; // constructors @Override התאמות בוליאניות ציבוריות (הודעה מימין) {return left.getFrom (). שווה (right.getFrom ()) && left.getTo (). שווה (right.getTo ()) && left.getText (). שווה (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

כדי להשתמש בהתאמה שלנו, עלינו לשנות את המבחן ולהחליף כל על ידי לטעון את זה:

אמת (messageService, זמנים (1)). deliverMessage (argThat (MessageMatcher חדש (הודעה)));

עכשיו אנחנו יודעים את שלנו הוֹדָעָה למשל יהיו אותם נתונים כמו שלנו MessageDTO.

5. התאמת ארגומנטים בהתאמה אישית לעומת ArgumentCaptor

שתי הטכניקות התאמת ארגומנטים בהתאמה אישית ו ArgumentCaptor יכול לשמש כדי לוודא שטיעונים מסוימים הועברו ללעג.

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

התאמת ארגומנטים בהתאמה אישית באמצעות ArgumentMatcher בדרך כלל טובים יותר לדקירות.

6. מסקנה

במאמר זה בחנו תכונה של מוקיטו, ArgumentMatcher וההבדל שלה עם ArgumentCaptor.

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


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