מדריך לציפיות JMockit

1. מבוא

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

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

2. התאמת ערכי טיעון

הגישות הבאות חלות הן על ציפיות בנוסף ל אימות.

2.1. שדות "כלשהו"

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

אלה יבדקו שכל ערך הועבר ויש אחד לכל סוג פרימיטיבי (ומחלקת העטיפה המתאימה), אחד למיתרים, ו"אוניברסלי "מסוג לְהִתְנַגֵד.

בואו נראה דוגמה:

ממשק ציבורי ExpectationsCollaborator {String methodForAny1 (String s, int i, Boolean b); שיטת הריקול ForFny2 (Long l, List lst); } @ מבחן הריק הציבורי של @ (@ Mocked ExpectationsCollaborator mock) זורק Exception {new Expectations () {{mock.methodForAny1 (anyString, anyInt, anyBoolean); תוצאה = "כל"; }}; Assert.assertEquals ("any", mock.methodForAny1 ("barfooxyz", 0, Boolean.FALSE)); mock.methodForAny2 (2L, ArrayList חדש ()); FullVerifications חדשים () {{mock.methodForAny2 (anyLong, (List) any); }}; }

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

2.2. שיטות "עם"

JMockit מספק גם מספר שיטות שיעזרו בהתאמת טיעונים כללית. אלה הם withX שיטות.

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

ממשק ציבורי ExpectationsCollaborator {String methodForWith1 (String s, int i); method voidForWith2 (b בוליאני, רשימה l); } @Test מבטל הריק testForWith (@Mocked ExpectationsCollaborator mock) זורק Exception {new Expectations () {{mock.methodForWith1 (withSubstring ("foo"), withNotEqual (1)); תוצאה = "עם"; }}; assertEquals ("עם", mock.methodForWith1 ("barfooxyz", 2)); mock.methodForWith2 (בוליאני. TRUE, ArrayList חדש ()); אימות חדש () {{mock.methodForWith2 (withNotNull (), withInstanceOf (List.class)); }}; }

אתה יכול לראות את הרשימה המלאה של withX שיטות בתיעוד של JMockit.

קחו בחשבון שהמיוחד עם (נציג) ו withArgThat (התאמה) יכוסו בסעיף קטן משלהם.

2.3. אפס אינו אפס

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

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

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

ממשק ציבורי ExpectationsCollaborator {String methodForNulls1 (String s, List l); שיטת voidForNulls2 (מחרוזת s, רשימה l); } @Test מבטל בטל ציבוריWithNulls (@Mocked ExpectationsCollaborator mock) {New Expectations () {{mock.methodForNulls1 (anyString, null); תוצאה = "null"; }}; assertEquals ("null", mock.methodForNulls1 ("blablabla", ArrayList חדש ())); mock.methodForNulls2 ("blablabla", null); אימות חדש () {{mock.methodForNulls2 (anyString, (List) withNull ()); }}; }

שימו לב להבדל: ריק פירושו כל רשימה ו withNull () פירושו א ריק התייחסות לרשימה. בפרט, זה נמנע מהצורך להטיל את הערך לסוג הפרמטר המוצהר (ראה שהארגומנט השלישי היה צריך להיות יצוק אך לא השני).

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

2.4. שדה "טיימס"

לפעמים אנחנו רוצים לְהַכרִיחַמספר הקריאות צפוי לשיטה לעגנית. לשם כך, ל- JMockit יש את המילים השמורות פִּי, דקות ו maxTimes (שלושתם מאפשרים מספרים שלמים שאינם שליליים בלבד).

ממשק ציבורי ExpectationsCollaborator {void methodForTimes1 (); method voidForTimes2 (); method voidForTimes3 (); } @Test מבטל בטל ציבוריWithTimes (@Mocked ExpectationsCollaborator לעג) {new Expectations () {{mock.methodForTimes1 (); פעמים = 2; mock.methodForTimes2 (); }}; mock.methodForTimes1 (); mock.methodForTimes1 (); mock.methodForTimes2 (); mock.methodForTimes3 (); mock.methodForTimes3 (); mock.methodForTimes3 (); אימות חדש () {{mock.methodForTimes3 (); minTimes = 1; maxTimes = 3; }}; }

בדוגמה זו הגדרנו כי בדיוק שתי קריאות (לא אחת, לא שלוש, בדיוק שתיים) מתוך methodForTimes1 () צריך להיעשות באמצעות הקו פעמים = 2;.

ואז השתמשנו בהתנהגות ברירת המחדל (אם לא ניתנת אילוץ חזרה minTimes = 1; משמש) כדי להגדיר שלפחות קריאה אחת תיעשה methodForTimes2 ().

לבסוף, באמצעות minTimes = 1; בא אחריו maxTimes = 3; הגדרנו שבין קריאה אחת לשלוש תתרחש methodForTimes3 ().

קחו בחשבון ששניהם minTimes ו maxTimes ניתן לציין לאותה ציפייה, כל עוד דקות מוקצה ראשון. מצד שני, פִּי יכול לשמש רק לבד.

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

לפעמים התאמת ארגומנטים אינה ישירה כמו פשוט ציון ערך או שימוש בכלי עזר כלשהו שהוגדרו מראש (anyX אוֹ withX).

למקרים אלה, JMockit מסתמך על המקסטר שידוך מִמְשָׁק. אתה רק צריך להגדיר התאמה לתרחיש הבדיקה הספציפי ולהשתמש בהתאמה זו עם withArgThat () שִׂיחָה.

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

ממשק ציבורי ExpectationsCollaborator {void methodForArgThat (Object o); } מודל מחלקה ציבורית {public String getInfo () {return "info"; }} @Test הריקני מבחן TestCustomArgumentMatching (@Mocked ExpectationsCollaborator mock) {new Expectations () {{mock.methodForArgThat (withArgThat (new BaseMatcher () {@Override matches בוליאני ציבורי (פריט אובייקט) {return item example of Model && "info"). שווה לפריט (((דגם)) .getInfo ());} @ ביטול ציבורי ריק ריק תיאור (תיאור תיאור) {}})); }}; mock.methodForArgThat (דגם חדש ()); }

3. החזרת ערכים

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

3.1. תוצאה והחזרות (...)

בעת שימוש ב- JMockit, יש לך שלוש דרכים שונות להגדיר את התוצאה הצפויה של קריאה לשיטה הלעוגת. מבין שלושתם נדבר כעת על השניים הראשונים (הפשוטים ביותר) שבוודאי יכסו 90% ממקרי השימוש היומיומיים.

שני אלה הם תוֹצָאָה שדה ו מחזיר (אובייקט ...) שיטה:

  • עם ה תוֹצָאָה שדה, אתה יכול להגדיר אחד ערך החזרה לכל שיטה הלעוגית שאינה בטלה. ערך החזרה זה יכול להיות גם יוצא מן הכלל שיש לזרוק (הפעם עובד בשיטות החזרה שאינן בטלות וגם בטלות).
    • כַּמָה תוֹצָאָה ניתן לבצע מטלות בשטח על מנת לחזור יותר מערך אחד ליותר משתי קריאות שיטה אחת (ניתן לערבב גם ערכי החזרה וגם שגיאות שיש להשליך).
    • אותה התנהגות תושג בעת הקצאה ל תוֹצָאָה רשימה או מערך ערכים (מאותו סוג מהסוג ההחזרה של השיטה הלעגנית, ללא יוצאים מן הכלל כאן).
  • ה מחזיר (אובייקט ...) השיטה היא סוכר תחבירי להחזרת מספר ערכים באותו הזמן.

זה מוצג ביתר קלות עם קטע קוד:

ממשק ציבורי ExpectationsCollaborator {String methodReturnsString (); int methodReturnsInt (); } @ Test test public void testResultAndReturns (@Mocked ExpectationsCollaborator mock) {new Expectations () {{mock.methodReturnsString (); תוצאה = "foo"; תוצאה = חריג חדש (); תוצאה = "סרגל"; מחזיר ("foo", "bar"); mock.methodReturnsInt (); תוצאה = int int [] {1, 2, 3}; תוצאה = 1; }}; assertEquals ("צריך להחזיר foo", "foo", mock.methodReturnsString ()); נסה את {mock.methodReturnsString (); להיכשל ("לא צריך להגיע לכאן"); } לתפוס (חריג e) {// NOOP} assertEquals ("צריך להחזיר סרגל", "סרגל", mock.methodReturnsString ()); assertEquals ("צריך להחזיר 1", 1, mock.methodReturnsInt ()); assertEquals ("צריך להחזיר 2", 2, mock.methodReturnsInt ()); assertEquals ("צריך להחזיר 3", 3, mock.methodReturnsInt ()); assertEquals ("צריך להחזיר foo", "foo", mock.methodReturnsString ()); assertEquals ("אמור להחזיר סרגל", "סרגל", mock.methodReturnsString ()); assertEquals ("צריך להחזיר 1", 1, mock.methodReturnsInt ()); }

בדוגמה זו, הגדרנו כי בשלושת השיחות הראשונות אל methodReturnsString () התשואות הצפויות הן (לפי הסדר) "פו", חריג ו "בָּר". השגנו זאת באמצעות שלוש מטלות שונות ל תוֹצָאָה שדה.

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

בשביל ה methodReturnsInt () הגדרנו הלאה שורה 13 להחזיר 1, 2 ולבסוף 3 על ידי הקצאת מערך עם התוצאות השונות ל- תוֹצָאָה שדה ואילך שורה 15 הגדרנו להחזיר 1 על ידי הקצאה פשוטה ל- תוֹצָאָה שדה.

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

3.2. נציגים

לסיום המאמר נסקור את הדרך השלישית להגדרת ערך ההחזר: ה- נָצִיג מִמְשָׁק. ממשק זה משמש להגדרת ערכי החזרה מורכבים יותר בעת הגדרת שיטות ללעג.

אנו נראה דוגמה להסבר פשוט:

ממשק ציבורי ExpectationsCollaborator {int methodForDelegate (int i); } @Test ציבורי בטל testDelegate (@Mocked ExpectationsCollaborator לעג) {new Expectations () {{mock.methodForDelegate (anyInt); תוצאה = נציג חדש () {int נציג (int i) זורק חריג {אם (i <3) {return 5; } אחר {זרוק חריג חדש (); }}}; }}; assertEquals ("צריך להחזיר 5", 5, mock.methodForDelegate (1)); נסה {mock.methodForDelegate (3); להיכשל ("לא צריך להגיע לכאן"); } לתפוס (חריג e) {}} 

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

בדוגמה עשינו יישום שבו 5 יש להחזיר כאשר הערך המועבר לשיטה הלעגנית נמוך מ- 3 וחריג נזרק אחרת (שימו לב שהיינו צריכים להשתמש פעמים = 2; כך שההפעלה השנייה צפויה כיוון שאיבדנו את התנהגות ברירת המחדל על ידי הגדרת ערך החזר).

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

4. מסקנה

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

אנו כמובן נפרסם מאמרים נוספים ב- JMockit, לכן הישאר מעודכן ללמוד עוד יותר.

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

4.1. מאמרים בסדרה

כל מאמרי הסדרה:

  • JMockit 101
  • מדריך לציפיות JMockit
  • שימוש מתקדם ב- JMockit

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