JMockit 101

1. הקדמה

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

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

מאמרים מאוחרים יותר יתמקדו ויתעמקו ביכולותיו.

2. JMockit

2.1. מבוא

קודם כל, בואו נדבר על מה זה JMockit: מסגרת Java ללעוג לאובייקטים במבחנים (תוכלו להשתמש בה גם עבור JUnit וגם עבור TestNG).

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

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

2.2. תלות של Maven

ראשית, נצטרך להוסיף את התלות ב- jmockit לפרויקט שלנו:

 org.jmockit jmockit 1.41 

2.3. הביטוי של JMockit

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

פירוש הדבר שלא תעשה דברים כמו:

API.expect (mockInstance.method ()). AndThenReturn (value) .times (2);

במקום זאת, צפו לדברים כמו:

ציפייה חדשה () {mockInstance.method (); תוצאה = ערך; פעמים = 2; }

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

אם אתה לוקח בחשבון את זה על תוצאה = ערך אם אתה יכול להחזיר כל דבר (ערכים קבועים, ערכים שנוצרו באופן דינמי, חריגים וכו '), האקספרסיביות של JMockit ניכרת עוד יותר.

2.4. מודל הקלטה-הפעלה חוזרת

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

  1. על תקליט בשלב, במהלך הכנת הבדיקה ולפני הקריאות לשיטות שאנו רוצים לבצע, נגדיר את ההתנהגות הצפויה לכל הבדיקות שישמשו בשלב הבא.
  2. ה שידור חוזר השלב הוא זה שבו מבצעים את הקוד הנבדק. הקריאות של שיטות / קונסטרוקטורים לעגים שהוקלטו בעבר בשלב הקודם ישוחזרו כעת.
  3. לבסוף, על תאשר בשלב, נקבע כי תוצאת הבדיקה הייתה זו שציפינו (וכי הלעג התנהג והיה בשימוש על פי מה שהוגדר בשלב השיא).

עם דוגמת קוד, מסגרת קווית למבחן תיראה כך:

@Test בטל פומבי testWireframe () {// קוד הכנה שאינו ספציפי ל- JMockit, אם ציפיות חדשות () {{// מגדירות התנהגות צפויה ללעג}}; // לבצע קוד תחת בדיקה אימות חדש () {{// אמת לעגות}}; // טענות}

3. יצירת לעגים

3.1. ההערות של JMockit

כאשר משתמשים ב- JMockit, הדרך הקלה ביותר להשתמש בלעג, היא להשתמש בהערות. ישנם שלושה ליצירת לעגים (@Mocked, הזרקת ו @ לכידה) ואחד לציין את הכיתה הנבדקת (@בָּדוּק).

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

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

ההערה האחרונה, @ לכידה יתנהג כמו @Mocked, אך יאריך את טווח ההגעה שלו לכל תת-מחלקה המרחיבה או מיישמת את סוג השדה המאושר.

3.2. העברת ויכוחים למבחנים

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

@RunWith (JMockit.class) מחלקה ציבורית TestPassingArguments {@Injectable Foo mockForEveryTest private; @ בר בר פרטי נבדק; @Test public void testExample (@Mocked Xyz mockForJustThisTest) {New Expectations () {{mockForEveryTest.someMethod ("foo"); mockForJustThisTest.someOtherMethod (); }}; bar.codeUnderTest (); }}

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

3.3. דוגמה מלאה

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

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

אז השיעורים שנבדקו ייראו כך:

מודל מחלקה ציבורית {public String getInfo () {return "info"; }} שיתוף פעולה בכיתה ציבורית {שיתוף פעולה ציבורי בוליאני (מחרוזת מחרוזת) {return false; } קבל חלל ציבורי (בוליאני בוליאני) {// NOOP}} מבצע בכיתה ציבורית {משתף פעולה פרטי של משתף פעולה; ביצוע חלל ציבורי (מודל מודל) {ערך בוליאני = collaborator.collaborate (model.getInfo ()); משתף פעולה.קבל (ערך); }}

וקוד המבחן יהיה בסופו של דבר כמו:

@RunWith (JMockit.class) PerformerTest בכיתה ציבורית {@Injectable Private Collaborator; @ שחקן פרפורמר פרטי שנבדק; מבחן הריק הציבורי @TestThePerformMethod (מודל @Mocked Model) {ציפיות חדשות () {{model.getInfo (); result = "bar"; collaborator.collaborate ("בר"); תוצאה = נכון; }}; performer.perform (דגם); אימות חדש () {{collaborator.receive (true); }}; }}

4. מסקנה

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

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

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

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

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

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