שימוש ב- Mockito ArgumentCaptor

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

במדריך זה נסקור מקרה נפוץ של שימוש במוקיטו ArgumentCaptor במבחני היחידות שלנו.

לחלופין, עבור אחרים Mockito.verify להשתמש במקרים, עיין בספר הבישול Mockito Verify שלנו.

2. שימוש ArgumentCaptor

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

לדוגמה, שקול שירות אימייל כיתה עם א לִשְׁלוֹחַ שיטה שנרצה לבדוק:

מעמד ציבורי EmailService {פלטפורמת DeliveryPlatform פרטית; שירות דוא"ל ציבורי (פלטפורמת DeliveryPlatform) {this.platform = פלטפורמה; } שליחה בטלנית ציבורית (מחרוזת אל, נושא מחרוזת, גוף מחרוזת, HTML בוליאני) {פורמט פורמט = Format.TEXT_ONLY; אם (html) {format = Format.HTML; } דוא"ל בדוא"ל = דוא"ל חדש (ל, נושא, גוף); email.setFormat (פורמט); platform.deliver (דוא"ל); } ...}

ב שירות אימייל.לִשְׁלוֹחַ, שים לב איך platform.deliver לוקח חדש אימייל כוויכוח. כחלק מהבדיקה שלנו, נרצה לבדוק את שדה הפורמט של החדש אימייל נקבע ל פורמט. HTML. על מנת לעשות זאת, עלינו ללכוד ולבדוק את הטיעון המועבר אליו platform.deliver.

בואו נראה איך נוכל להשתמש ArgumentCaptor לעזור לנו.

2.1. הגדר את מבחן היחידה

ראשית, בואו ניצור את מחלקת המבחנים שלנו:

@RunWith (MockitoJUnitRunner.class) מחלקה ציבורית EmailServiceUnitTest {@Mock DeliveryPlatform פלטפורמה; @InjectMocks EmailService emailService; ...}

אנו משתמשים ב- @לִלְעוֹג ביאור ללעג DeliveryPlatform, המוזרק אוטומטית לשלנו שירות אימייל עם ה @InjectMocks ביאור. לקבלת פרטים נוספים, עיין במאמר ההערות Mockito שלנו.

2.2. הוסף ArgumentCaptor שדה

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

@Captor ArgumentCaptor emailCaptor;

2.3. תפוס את הוויכוח

שלישית, בואו נשתמש Mockito. אמת עם ה ArgumentCaptor כדי ללכוד את אימייל:

Mockito.verify (platform) .deliver (emailCaptor.capture ());

לאחר מכן נוכל לקבל את הערך שנלכד ולאחסן אותו כחדש אימייל לְהִתְנַגֵד:

דוא"ל emailCaptorValue = emailCaptor.getValue ();

2.4. בדוק את הערך שנלכד

לבסוף, בואו נראה את כל הבדיקה עם טענה לבדוק את השבי אימייל לְהִתְנַגֵד:

@ מבחן ציבורי בטל כאשר DoSSupportHtml_expectHTMLEmailFormat () {String to = "[email protected]"; נושא מחרוזת = "שימוש ב- ArgumentCaptor"; גוף מחרוזת = "היי, בואו נשתמש ב- ArgumentCaptor"; emailService.send (אל, נושא, גוף, נכון); Mockito.verify (platform) .deliver (emailCaptor.capture ()); ערך דוא"ל = emailCaptor.getValue (); assertEquals (Format.HTML, value.getFormat ()); }

3. הימנעות מדקירות

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

בואו נסתכל על כמה סיבות מדוע עלינו להימנע מדקירות.

3.1. ירידה בקריאות המבחנים

ראשית, שקול מבחן פשוט:

אישורי אישורים = אישורים חדשים ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (Mockito.eq (credentials))) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (אישורים));

הנה, אנו משתמשים Mockito.eq (אישורים) כדי לציין מתי המדומה צריכה להחזיר אובייקט.

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

אישורי אישורים = אישורים חדשים ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (credentialsCaptor.capture ())) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (אישורים)); assertEquals (אישורים, אישוריםקפטור. getValue ());

בניגוד למבחן הראשון, שימו לב כיצד עלינו לבצע טענה נוספת בשורה האחרונה בכדי לעשות את אותו הדבר כמו Mockito.eq (אישורים).

לבסוף, שים לב כיצד לא ברור מיד מה credentialsCaptor.capture () מתייחס ל. הסיבה לכך היא שעלינו ליצור את השוער מחוץ לקו בו אנו משתמשים בו, מה שמפחית את הקריאה.

3.2. פגם מופחת לוקליזציה

סיבה נוספת היא שאם emailService.authenticatedSuccess בהצלחה לא מתקשר פלטפורמה.אמת, נקבל חריג:

org.mockito.exceptions.base.MockitoException: שום ערך ארגומנט לא נתפס!

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

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

4. מסקנה

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