התאמה אישית של Hamcrest

1. הקדמה

כמו גם התאמות מובנות, Hamcrest מספק תמיכה גם ביצירת התאמות מותאמות אישית.

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

2. הגדרת התאמה אישית של התאמה

כדי להשיג את המקרסט, אנחנו צריכים הוסף את התלות הבאה של Maven שלנו pom.xml:

 מבחן org.hamcrest java-hamcrest 2.0.0.0 

את הגרסה האחרונה של Hamcrest ניתן למצוא ב- Maven Central.

3. היכרות TypeSafeMatcher

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

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

  • התאמות בטוח (T t): מכיל את ההיגיון התואם שלנו
  • beskriv To (תיאור תיאור): מתאימה אישית את המסר שהלקוח יקבל כאשר ההיגיון התואם שלנו לא יתמלא

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

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

4. יצירת ה- רק ספרות שידוך

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

כך, רק ספרות מוחל על "123" צריך לחזור נָכוֹן בזמן "שלום 1"ו"ביי"צריך להחזיר כוזב.

בואו נתחיל!

4.1. יצירת התאמה

כדי להתחיל עם ההתאמה שלנו, ניצור מחלקה שמתארכת TypeSafeMatcher:

מחלקה ציבורית IsOnlyDigits מרחיב את TypeSafeMatcher {@Override התאמות בוליאניות מוגנות Safe (מחרוזות) {// ...} @Override פומבי ריק לתאר (תיאור תיאור) {// ...}}

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

כעת אנו מוכנים להוסיף את היישום שלנו:

מחלקה ציבורית IsOnlyDigits מרחיב את TypeSafeMatcher {@Override התאמות בוליאניות מוגנותSafely (String s) {try {Integer.parseInt (s); לחזור אמיתי; } לתפוס (NumberFormatException nfe) {return false; }} @ ביטול הריק הציבורי תיאור לתיאור (תיאור תיאור) {description.appendText ("ספרות בלבד"); }}

כמו שאנו יכולים לראות, matchesSafey מנסה לנתח את התשומות שלנו חוּט לתוך מספר שלם. אם זה מצליח, הוא חוזר נָכוֹן. אם הוא נכשל, הוא חוזר שֶׁקֶר. זה מגיב בהצלחה למקרה השימוש שלנו.

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

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

אז נוסיף משהו כזה:

Matcher static public onlyDigits () {להחזיר IsOnlyDigits חדשים (); }

וגמרנו! בואו נראה כיצד להשתמש בהתאמה זו בחלק הבא.

4.2. שימוש בהתאמה

ל השתמש בשדכן החדש שלנו, אנו ניצור מבחן:

@ מבחן חלל ציבורי שניתן AString_whenIsOnlyDigits_thenCorrect () {ספרות מחרוזת = "1234"; assertThat (ספרות, onlyDigits ()); }

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

assertThat (ספרות, הוא (onlyDigits ()));

לבסוף, אם היינו מבצעים את אותה הבדיקה אך עם הקלט "123ABC", הודעת הפלט תהיה:

java.lang.AssertionError: צפוי: ספרות בלבד אך: היה "123ABC"

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

5. מתחלק על ידי

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

בואו נראה איך נוכל לעשות זאת:

מחלקה ציבורית IsDivisibleBy מרחיב TypeSafeMatcher {מחלק שלם פרטי פרטי; // בוני @Override התאמות בוליאניות מוגנות Safe (דיבידנד שלם) {if (divider == 0) {return false; } תשואה ((מחלק% דיבידנד) == 0); } @ ביטול חלל ציבורי תיאור לתיאור (תיאור תיאור) {description.appendText ("ניתן לחלוקה על ידי" + מחלק); } ציבורי סטטי ציבורי divisibleBy (מחלק שלם) {החזר IsDivisibleBy חדש (מחלק); }}

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

@Test הציבור בטל givenAnEvenInteger_whenDivisibleByTwo_thenCorrect () {מספר שלם עשר = 10; שלם שני = 2; assertThat (עשר, הוא (מתחלק על ידי (שניים))); } @Test הציבור בטל givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect () {שלם אחד עשר = 11; שלם שני = 2; טוענים כי (אחד עשר, הוא (לא (ניתן לחלוקה על ידי (שניים))); }

וזה הכל! כבר יש לנו התאמה שלנו המשתמשת ביותר מקלט אחד!

6. מסקנה

Hamcrest מספקת התאמות המכסות את רוב מקרי השימוש שמפתח בדרך כלל צריך להתמודד איתם בעת יצירת קביעות.

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

לקבלת יישום מלא של דוגמאות אלה, עיין בפרויקט GitHub.