מוקיטו - שימוש במרגלים

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

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

נדבר על @מרגל ביאור, כיצד לדחות מרגל ולבסוף - ניכנס להבדל בין לִלְעוֹג ו מרגל.

וכמובן, ליתרון טוב יותר של מוקיטו, עיין בסדרה כאן.

2. פשוט מרגל דוגמא

נתחיל בדוגמה פשוטה של כיצד להשתמש ב- מרגל.

במילים פשוטות, ה- API הוא Mockito.spy () - ל לרגל אחר חפץ אמיתי.

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

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

@Test ציבורי בטל כאשרSpyingOnList_thenCorrect () {List list = new ArrayList (); רשימת spyList = Mockito.spy (רשימה); spyList.add ("אחד"); spyList.add ("שניים"); Mockito.verify (spyList) .add ("אחד"); Mockito.verify (spyList) .add ("שניים"); assertEquals (2, spyList.size ()); }

שימו לב איך השיטה האמיתית לְהוֹסִיף() נקרא למעשה ואיך הגודל של spyList הופך ל -2.

3. ה @מרגל ביאור

הבא - בואו נראה כיצד להשתמש ב- @מרגל ביאור. אנחנו יכולים להשתמש @מרגל ביאור במקום מרגל() כמו בדוגמה הבאה:

רשימת @Spy spyList = ArrayList חדש (); @ מבחן ציבורי בטל כאשר משתמשיםTheSpyAnnotation_thenObjectIsSpied () {spyList.add ("אחד"); spyList.add ("שניים"); Mockito.verify (spyList) .add ("אחד"); Mockito.verify (spyList) .add ("שניים"); assertEquals (2, spyList.size ()); }

כדי אפשר הערה Mockito (כמו @מרגל, @לִלְעוֹג, ...) - עלינו לעשות אחת מהפעולות הבאות:

  • התקשרו לשיטה MockitoAnnotations.initMocks (זה) כדי לאתחל שדות עם הערות
  • השתמש ברץ המובנה @RunWith (MockitoJUnitRunner.class)

4. דקירה א מרגל

עכשיו - בואו נראה איך לדקור a מרגל. אנו יכולים להגדיר / לעקוף את ההתנהגות של שיטה תוך שימוש באותו תחביר בו היינו משתמשים עם דמה.

בדוגמה הבאה - אנו משתמשים doReturn () לבטל את גודל() שיטה:

@Test הציבור בטל כאשרStubASpy_thenStubbed () {List list = ArrayList new (); רשימת spyList = Mockito.spy (רשימה); assertEquals (0, spyList.size ()); Mockito.doReturn (100). When (spyList) .size (); assertEquals (100, spyList.size ()); }

5. לִלְעוֹג לעומת. מרגל במוקיטו

עכשיו - בואו נדבר על ההבדל בין לִלְעוֹג ו מרגל במוקיטו - לא ההבדלים התיאורטיים בין שני המושגים, אלא רק איך הם נבדלים בתוך מוקיטו עצמו.

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

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

בדוגמה הבאה - אנו יוצרים a לִלְעוֹג של ה רשימת מערך מעמד:

@Test ציבורי בטל כאשרCreateMock_thenCreated () {רשימה mockedList = Mockito.mock (ArrayList.class); mockedList.add ("אחד"); Mockito.verify (mockedList) .add ("אחד"); assertEquals (0, mockedList.size ()); }

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

מרגל לעומת זאת יתנהג אחרת - למעשה יקרא ליישום האמיתי של ה- לְהוֹסִיף שיטה והוסף את האלמנט לרשימה הבסיסית:

@ מבחן ציבורי בטל כאשרCreateSpy_thenCreate () {רשימה spyList = Mockito.spy (ArrayList חדש ()); spyList.add ("אחד"); Mockito.verify (spyList) .add ("אחד"); assertEquals (1, spyList.size ()); }

6. הבנת המוקיטו NotAMockException

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

נתחיל לראות באילו נסיבות חריג זה יכול להתרחש:

רשימת רשימה = ArrayList חדש (); Mockito.doReturn (100). מתי (רשימה) .גודל (); assertEquals ("הגודל צריך להיות 100:", 100, list.size ()); 

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

org.mockito.exceptions.misusing.NotAMockException: הטיעון הועבר כאשר () אינו לעג! דוגמה לדקירות נכונות: doThrow (RuntimeException חדש ()). When (מדומה) .someMethod (); 

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

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

רשימה סופית spyList = Mockito.spy (ArrayList חדש ()); Mockito.doReturn (100). When (spyList) .size (); assertEquals ("הגודל צריך להיות 100:", 100, spyList.size ()); 

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

7. מסקנה

במאמר מהיר זה דנו בדוגמאות השימושיות ביותר לשימוש במרגלים Mockito.

למדנו ליצור א מרגל, איך להישתמש @מרגל ביאור, כיצד לדקור א מרגל ולבסוף - ההבדל בין לִלְעוֹג ו מרגל.

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

זהו פרויקט של Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.

וכמובן, ליתרון טוב יותר של מוקיטו, עיין בסדרה כאן.