מדריך לתנאים המוקדמים של גויאבה

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

במדריך זה נראה כיצד להשתמש ב- Google Guava תנאים מוקדמים מעמד.

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

2. Google גויאבה תנאים מוקדמים

כל שיטה סטטית ב- תנאים מוקדמים לכיתה יש שלוש גרסאות:

  • אין ויכוחים. יוצאים מן הכלל ללא הודעת שגיאה
  • תוספת לְהִתְנַגֵד טיעון מתנהג כהודעת שגיאה. יוצאים מן הכלל עם הודעת שגיאה
  • טיעון מחרוזת נוסף, עם מספר שרירותי של תוספת לְהִתְנַגֵד טיעונים הפועלים כהודעת שגיאה עם מציין מיקום. זה מתנהג קצת כמו printfאבל לתאימות ויעילות GWT זה רק מאפשר % s אינדיקטורים

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

2.1. תלות של Maven

נתחיל בהוספת תלות בספריית גויאבה של גוגל ב pom.xml:

 com.google.guava גויאבה 29.0-jre 

ניתן לבדוק כאן את הגרסה האחרונה של התלות.

3. checkArgument

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

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

3.1. ללא הודעת שגיאה

אנחנו יכולים להשתמש checkArgument מבלי להעביר פרמטר נוסף ל checkArgument שיטה:

@ מבחן ציבורי בטל כאשרCheckArgumentEvaluatesFalse_throwsException () {int age = -18; assertThatTrowneBy (() -> תנאים מוקדמים. checkArgument (גיל> 0)) .isInstanceOf (IllegalArgumentException.class) .hasMessage (null) .hasNoCause (); }

3.2. עם הודעת שגיאה

אנו יכולים לקבל הודעת שגיאה משמעותית מה- checkArgument שיטה על ידי העברת הודעת שגיאה:

@Test הציבור בטל givenErrorMsg_whenCheckArgEvalsFalse_throwsException () {int גיל = -18; הודעת מחרוזת = "הגיל לא יכול להיות אפס או פחות מאפס."; assertThatThrownBy (() -> תנאים מוקדמים. checkArgument (גיל> 0, הודעה)). isInstanceOf (IllegalArgumentException.class) .hasMessage (הודעה) .hasNoCause (); }

3.3. עם הודעת שגיאה בתבנית

אנו יכולים לקבל הודעת שגיאה משמעותית יחד עם נתונים דינמיים מה- checkArgument שיטה על ידי העברת הודעת שגיאה:

@Test הציבור בטל givenTemplateMsg_whenCheckArgEvalsFalse_throwsException () {int age = -18; הודעת מחרוזת = "הגיל צריך להיות מספר חיובי, סיפקת את% s."; assertThatThrownBy (() -> תנאים מוקדמים. checkArgument (גיל> 0, הודעה, גיל)). isInstanceOf (IllegalArgumentException.class) .hasMessage (הודעה, גיל). hasNoCause (); } 

4. checkElementIndex

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

בואו נראה כיצד נוכל להשתמש בשיטה זו על ידי הצגת הודעת שגיאה משמעותית מה- checkElementIndex שיטה על ידי העברת הודעת שגיאה כאשר היא מציגה חריג:

@Test הציבור בטל givenArrayAndMsg_whenCheckElementEvalsFalse_throwsException () {int [] numbers = {1, 2, 3, 4, 5}; הודעת מחרוזת = "אנא בדוק את גבולות המערך ונסה שוב"; assertThatThrownBy (() -> Preconditions.checkElementIndex (6, numbers.length - 1, message)) .isInstanceOf (IndexOutOfBoundsException.class) .hasMessageStartingWith (message) .hasNoCause (); }

5. checkNotNull

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

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

@Test הציבור בטל givenNullString_whenCheckNotNullWithMessage_throwsException () {String nullObject = null; הודעת מחרוזת = "אנא בדוק את האובייקט שסופק, האפס שלו!"; assertThatThrownBy (() -> Preconditions.checkNotNull (nullObject, message)) .isInstanceOf (NullPointerException.class) .hasMessage (message) .hasNoCause (); }

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

@Test ציבורי בטל כאשרCheckNotNullWithTemplateMessage_throwsException () {String nullObject = null; הודעת מחרוזת = "אנא בדוק את האובייקט שסופק, את% s שלו!"; assertThatThrownBy (() -> Preconditions.checkNotNull (nullObject, הודעה, אובייקט חדש [] {null})). isInstanceOf (NullPointerException.class) .hasMessage (message, nullObject) .hasNoCause (); }

6. checkPositionIndex

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

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

בואו נראה כיצד נוכל לקבל הודעת שגיאה משמעותית מה- checkPositionIndex שיטה:

@Test ציבור בטל givenArrayAndMsg_whenCheckPositionEvalsFalse_throwsException () {int [] numbers = {1, 2, 3, 4, 5}; הודעת מחרוזת = "אנא בדוק את גבולות המערך ונסה שוב"; assertThatThrownBy (() -> Preconditions.checkPositionIndex (6, numbers.length - 1, message)) .isInstanceOf (IndexOutOfBoundsException.class) .hasMessageStartingWith (message) .hasNoCause (); }

7. checkState

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

בואו נראה כיצד נוכל להשתמש בשיטה זו על ידי הצגת הודעת שגיאה משמעותית מה- checkState שיטה על ידי העברת הודעת שגיאה כאשר היא מציגה חריג:

@Test ציבורי בטל givenStatesAndMsg_whenCheckStateEvalsFalse_throwsException () {int [] validStates = {-1, 0, 1}; int givenState = 10; הודעת מחרוזת = "הזנת מצב לא חוקי"; assertThatThrownBy (() -> Preconditions.checkState (Arrays.binarySearch (validStates, givenState)> 0, message)) .isInstanceOf (IllegalStateException.class) .hasMessageStartingWith (message) .hasNoCause (); }

8. מסקנה

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

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


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