ההבדל בין שיטות מתי () ו- doXxx () במוקיטו

1. הקדמה

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

כעת נתמקד בציון התנהגות מדומה. יש לנו שתי דרכים לעשות זאת: מתי (). thenDoSomething () וה doSomething (). מתי () תחביר.

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

2. מתי() שיטה

בואו ניקח בחשבון את הדברים הבאים עוֹבֵד מִמְשָׁק:

ממשק עובד {מחרוזת לברך (); עבודה בטלה (יום DayOfWeek); }

במבחנים שלנו אנו משתמשים במלוא הממשק הזה. בואו נגיד שאנחנו רוצים להגדיר את המדומה לברך() שיטה להחזרת המחרוזת "שלום". פשוט לעשות זאת באמצעות Mockito's מתי() שיטה:

@Test void givenNonVoidMethod_callingWhen_shouldConfigureBehavior () {// ניתן כאשר (עובד.ברכה ()). ואז חזור ("שלום"); // כשברכת מחרוזת = עובד.ברכה (); // ואז טוענים כי (ברכה, הוא ("שלום")); }

מה קורה? ה עוֹבֵד אובייקט הוא לעג. כשאנחנו מתקשרים לאחת מהשיטות שלה, Mockito רושם את השיחה הזו. עם קריאתו של מתי() בשיטה, Mockito יודע שההפעלה הזו לא הייתה אינטראקציה על ידי ההיגיון העסקי. זו הייתה הצהרה שאנחנו רוצים להקצות התנהגות מסוימת לאובייקט המדומה. אחרי זה, עם אחד מה thenXxx () שיטות, אנו מציינים את ההתנהגות הצפויה.

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

@Test void givenVoidMethod_callingWhen_wontCompile () {// ניתן כאשר (עובד.עבודה (DayOfWeek.SUNDAY)). ThenTrow (חדש IAmOnHolidayException ()); // כאשר ביצוע workCall = () -> עובד.עבודה (DayOfWeek.SUNDAY); // ואז assertThrows (IAmOnHolidayException.class, workCall); }

למרבה הצער, קוד זה לא יתאסף, מכיוון שב- עבודה (עובד. עבודה (...)) תתקשר ל עֲבוֹדָה() לשיטה יש בָּטֵל סוג החזרה; מכאן שאיננו יכולים לעטוף אותו בשיחת שיטה אחרת. האם זה אומר שאנחנו לא יכולים ללעוג לשיטות ריק? כמובן שאנחנו יכולים. doXxx שיטות להצלה!

3. doXxx () שיטות

בואו נראה איך נוכל להגדיר את החריג לזרוק עם ה- doTrow () שיטה:

@Test void givenVoidMethod_callingDoThrow_shouldConfigureBehavior () {// given doThrow (IAmOnHolidayException new ()). When (עובד) .work (DayOfWeek.SUNDAY); // כאשר ביצוע workCall = () -> עובד.עבודה (DayOfWeek.SUNDAY); // ואז assertThrows (IAmOnHolidayException.class, workCall); }

התחביר הזה שונה במקצת מהקודם: אנחנו לא מנסים לעטוף a בָּטֵל שיחת שיטה בתוך שיחת שיטה אחרת. לכן קוד זה מהדר.

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

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

למה יש לנו את הראשון מתי (). אז Xxx (), כאשר הוא אינו מסוגל למשימה כה נפוצה, כמו הגדרת תצורה של בָּטֵל קְרִיאָה? יש לו יתרונות מרובים ל doXxx (). מתי () תחביר.

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

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

מצד שני, doXxx () שיטות להחזיר א סתום למשל, ו Stubber.when (T mock) החזרות ט, כדי שנוכל לציין איזה סוג של הפעלת שיטה אנו רוצים להגדיר. אבל ט הוא חלק מהיישום שלנו, למשל, עוֹבֵד בקטעי הקוד שלנו. אבל ט לא יחזיר שיעור Mockito, כך שלא נוכל להוסיף התנהגויות מרובות באמצעות שרשור.

4. BDDMockito

BDDMockito משתמש בתחביר אלטרנטיבי לאלה שסיקרנו. זה די פשוט: בתצורות המדומות שלנו, עלינו להחליף את מילת המפתח "מתי" ל "נָתוּן"ומילת המפתח"לַעֲשׂוֹת" ל "רָצוֹן". מלבד זאת, הקוד שלנו נשאר זהה:

@Test void givenNonVoidMethod_callingGiven_shouldConfigureBehavior () {// given given (employee.greet ()). WillReturn ("Hello"); // כשברכת מחרוזת = עובד.ברכה (); // ואז טוענים כי (ברכה, הוא ("שלום")); } @Test void givenVoidMethod_callingWillThrow_shouldConfigureBehavior () {// given willThrow (IAmOnHolidayException new) (given). Given (עובד) .work (DayOfWeek.SUNDAY); // כאשר ביצוע workCall = () -> עובד.עבודה (DayOfWeek.SUNDAY); // ואז assertThrows (IAmOnHolidayException.class, workCall); }

5. מסקנה

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

כרגיל, הדוגמאות זמינות ב- GitHub.


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