שימוש במשחקי Hamcrest Number

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

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

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

2. התקנה

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

 org.hamcrest java-hamcrest 2.0.0.0 

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

3. משחקי קרבה

מערך השידוכים הראשון שעליו נסתכל הם אלה ש בדוק אם אלמנט כלשהו קרוב לערך +/- שגיאה.

יותר פורמלי:

ערך - שגיאה <= אלמנט <= ערך + שגיאה

אם ההשוואה לעיל נכונה, הקביעה תעבור.

בואו נראה את זה בפעולה!

3.1. קרוב עם לְהַכפִּיל ערכים

בואו נגיד שיש לנו מספר המאוחסן במשתנה כפול שנקרא מַמָשִׁי. ואנחנו רוצים לבדוק אם מַמָשִׁי הוא קרוב ל -1 +/- 0.5.

זה:

1 - 0.5 <= בפועל <= 1 + 0.5 0.5 <= בפועל <= 1.5

עכשיו בואו ניצור מבחן יחידה באמצעות קרוב שידוך:

@ מבט פומבי בטל שניתן ADouble_whenCloseTo_thenCorrect () {actual actual = 1.3; אופרנד כפול = 1; שגיאה כפולה = 0.5; assertThat (בפועל, closeTo (אופרנד, שגיאה)); }

מכיוון ש 1.3 הוא בין 0.5 ל 1.5, המבחן יעבור. באותה דרך אנו יכולים לבדוק את התרחיש השלילי:

@Test הציבור בטל שניתןADouble_whenNotCloseTo_thenCorrect () {כפול בפועל = 1.6; אופרנד כפול = 1; שגיאה כפולה = 0.5; assertThat (בפועל, לא (closeTo (אופרנד, שגיאה))); }

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

3.2. קרוב עם BigDecimal ערכים

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

@Test הציבור בטל שניתןABigDecimal_whenCloseTo_thenCorrect () {BigDecimal actual = new BigDecimal ("1.0003"); אופרנד BigDecimal = BigDecimal חדש ("1"); שגיאת BigDecimal = BigDecimal חדשה ("0.0005"); assertThat (בפועל, הוא (closeTo (אופרנד, שגיאה))); } @Test ציבורי בטל שניתןABigDecimal_whenNotCloseTo_thenCorrect () {BigDecimal בפועל = BigDecimal חדש ("1.0006"); אופרנד BigDecimal = BigDecimal חדש ("1"); שגיאת BigDecimal = BigDecimal חדשה ("0.0005"); assertThat (בפועל, הוא (לא (closeTo (אופרנד, שגיאה)))); }

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

זה בערך עבור התאמה קרובה. לאחר מכן, נסתכל על התאמת הזמנות.

4. הזמנת התאמות

כמו ששמם אומר, התאמות אלה עוזרות בהצהרות בנוגע להזמנה.

ישנם חמישה כאלה:

  • משווה את EqualTo
  • גדול מ
  • גדול מ או שווה ל
  • פחות מ
  • פחות מ או שווה ל

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

4.1. הזמן התאמות עם מספר שלם ויalues

התרחיש הנפוץ ביותר יהיה באמצעות התאמות אלה עם מספרים.

אז בואו ונפתח כמה בדיקות:

@Test הציבור בטל given5_whenComparesEqualTo5_thenCorrect () {מספר שלם חמש = 5; assertThat (חמש, משווה EqualTo (חמש)); } @Test ציבורי בטל נתון 5_whenNotComparesEqualTo7_thenCorrect () {מספר שלם שבע = 7; מספר שלם חמש = 5; assertThat (חמש, לא (משווה EqualTo (שבע))); } @Test הציבור בטל given7_whenGreaterThan5_thenCorrect () {מספר שלם שבע = 7; מספר שלם חמש = 5; assertThat (שבעה, זה (גדול יותר (חמש))); } @Test הציבור בטל נתון7_whenGreaterThanOrEqualTo5_thenCorrect () {מספר שלם שבע = 7; מספר שלם חמש = 5; assertThat (שבעה, הוא (גדול יותרתאנוקוולטו (חמש))); } @Test הציבור בטל given5_whenGreaterThanOrEqualTo5_thenCorrect () {מספר שלם חמש = 5; assertThat (חמש, הוא (largeThanOrEqualTo (חמש))); } @ מבחן חלל ציבורי given3_whenLessThan5_thenCorrect () {מספר שלם = 3; מספר שלם חמש = 5; assertThat (שלוש, זה (lessThan (חמש))); } @ Test public void given3_whenLessThanOrEqualTo5_thenCorrect () {מספר שלם שלוש = 3; מספר שלם חמש = 5; assertThat (שלוש, זה (lessThanOrEqualTo (חמש))); } @Test הציבור בטל given5_whenLessThanOrEqualTo5_thenCorrect () {מספר שלם חמש = 5; assertThat (חמש, הוא (lessThanOrEqualTo (חמש))); }

הגיוני, נכון? שים לב כמה פשוט להבין מה הטענות הטוענות.

4.2. הזמן התאמות עם חוּט ערכים

למרות שהשוואה בין מספרים הגיונית לחלוטין, פעמים רבות כדאי להשוות סוגים אחרים של אלמנטים. בגלל זה ניתן להחיל התאמות הזמנות לכל מחלקה שמיישמת את ניתן להשוות מִמְשָׁק.

בואו נראה כמה דוגמאות עם מיתרים:

@ מבט פומבי בטל שניתן Benjamin_whenGreaterThanAmanda_thenCorrect () {String amanda = "Amanda"; מחרוזת בנימין = "בנימין"; טוענים כי (בנימין, הוא (גדול יותר תאן (אמנדה))); } @ מבט בטל פומבי givenAmanda_whenLessThanBenajmin_thenCorrect () {String amanda = "Amanda"; מחרוזת בנימין = "בנימין"; טוענים כי (אמנדה, היא (lessThan (בנג'מין))); }

חוּט מיישם סדר אלפביתי ב בהשוואה ל שיטה מה- ניתן להשוות מִמְשָׁק.

לכן, הגיוני שהמילה "אמנדה" באה לפני המילה "בנימין".

4.3. הזמן התאמות עם LocalDate ערכים

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

@Test הציבור בטל givenToday_whenGreaterThanYesterday_thenCorrect () {LocalDate היום = LocalDate.now (); LocalDate אתמול = today.minusDays (1); assertThat (היום, הוא (greatThan (אתמול))); } @Test הציבור בטל givenToday_whenLessThanTomorrow_thenCorrect () {LocalDate היום = LocalDate.now (); LocalDate מחר = today.plusDays (1); assertThat (היום, הוא (lessThan (מחר))); }

זה מאוד נחמד לראות את ההצהרה assertThat (היום, הוא (lessThan (מחר))) קרוב לאנגלית רגילה.

4.4. הזמינו התאמות עם מחלקה אישיתes

אז למה לא ליצור כיתה משלנו וליישם ניתן להשוות? בצורה זו, אנו יכולים למנף התאמות הזמנות לשימוש בכללי הזמנה מותאמים אישית.

נתחיל ביצירת a אדם אפונה:

אדם בכיתה ציבורית {שם מחרוזת; גיל int; // קונסטרוקטור סטנדרטי, גטרים וקובעים}

עכשיו, בואו ניישם ניתן להשוות:

אדם בכיתה ציבורית מיישם השוואה {// ... @Override public int CompareTo (Person o) {if (this.age == o.getAge ()) return 0; אם (this.age> o.getAge ()) להחזיר 1; אחרת להחזיר -1; }}

שֶׁלָנוּ בהשוואה ל היישום משווה שני אנשים לפי גילם. בואו ניצור כעת כמה מבחנים חדשים:

@ מבט פומבי בטל שניתן Amanda_whenOlderThanBenjamin_thenCorrect () {Person amanda = אדם חדש ("אמנדה", 20); אדם בנימין = אדם חדש ("בנימין", 18); טוענים כי (אמנדה, הוא (גדול יותר תאן (בנג'מין))); } @Test public void givenBenjamin_whenYoungerThanAmanda_thenCorrect () {Person amanda = Person new ("Amanda", 20); אדם בנימין = אדם חדש ("בנימין", 18); טוענים כי (בנג'מין, הוא (פחות ת'אן (אמנדה))); }

תואמים יעבדו כעת על פי שלנו בהשוואה ל הִגָיוֹן.

5. Match Matcher

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

@ מבחן פומבי בטל givenNaN_whenIsNotANumber_thenCorrect () {אפס כפול = 0 ד; assertThat (אפס / אפס, הוא (notANumber ())); }

6. מסקנות

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

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

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

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


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