בדיקת חריגים עם MockMvc באביב

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

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

2. השלכת חריגים בבקרים

נתחיל ללמוד כיצד להפעיל חריג מבקר.

אנו יכולים לחשוב על השירותים שאנו חושפים מבקר באותו אופן כאילו היו פונקציות Java רגילות:

@GetMapping ("/ exception / throw") בטל ציבורי getException () זורק Exception {throw new Exception ("error"); } 

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

שנית, אנו מקבלים גוף תגובה כזה:

{"חותמת זמן": 1592074599854, "status": 500, "error": "שגיאת שרת פנימית", "message": "אין הודעה זמינה", "trace": "java.lang.Exception ב- com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}

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

3. מיפוי חריגים לקודי תגובת HTTP

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

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

@ResponseStatus (HttpStatus.BAD_REQUEST) מחלקה ציבורית BadArgumentsException מרחיב RuntimeException {public BadArgumentsException (הודעת מחרוזת) {super (הודעה); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) מחלקה ציבורית InternalException מרחיבה RuntimeException {PublicException ציבורית (הודעת מחרוזת) {super (הודעה); }}
@ResponseStatus (HttpStatus.NOT_FOUND) מחלקה ציבורית ResourceNotFoundException מרחיבה RuntimeException {public ResourceNotFoundException (הודעת מחרוזת) {super (הודעה); }}

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

@GetMapping ("/ exception / {exception_id}") public void getSpecificException (@PathVariable ("exception_id") מחרוזת pException) {if ("not_found" .equals (pException)) {זרוק ResourceNotFoundException חדש ("המשאב לא נמצא"); } אחרת אם ("bad_arguments" .equals (pException)) {זרוק BadArgumentsException חדש ("טיעונים רעים"); } אחר {זרוק InternalException חדש ("שגיאה פנימית"); }}

עכשיו, בואו נראה את התגובות השונות של השירות לחריגים השונים שמיפנו:

  • ל לא נמצא, אנו מקבלים קוד תגובה של 404
  • בהתחשב בערך ארגומנטים רעים, אנו מקבלים קוד תגובה של 400
  • עבור כל ערך אחר, אנו עדיין מקבלים 500 כקוד התגובה

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

4. בדיקת הבקרים שלנו

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

השלב הראשון הוא ליצור כיתת מבחן וליצור מופע של MockMvc:

@ MowMvc mvc פרטית אוטומטית; 

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

@Test ציבורי בטל givenNotFound_whenGetSpecificException_thenNotFoundCode () זורק Exception {String exceptionParam = "not_found"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)). andExpect (status (). isNotFound ()). andExpect (result -> assertTrue (result.getResolvedException () instance of ResourceNotFoundException)) .andExpect (תוצאה -> assertEquals ("המשאב לא נמצא", result.getResolvedException (). GetMessage ())); } @Test הציבור בטל givenBadArguments_whenGetSpecificException_thenBadRequest () זורק Exception {String exceptionParam = "bad_arguments"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)). andExpect (status (). isBadRequest ()). andExpect (result -> assertTrue (result.getResolvedException () instanceof BadArgumentsException)). AndExpect (תוצאה -> assertEquals ("טיעונים רעים", result.getResolvedException (). GetMessage ())); } @ מבט ציבורי בטל שניתן Other_whenGetSpecificException_thenInternalServerError () זורק Exception {String exceptionParam = "דמה"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)). andExpect (status (). isInternalServerError ()). andExpect (result -> assertTrue (result.getResolvedException () instance of) InternalException)). AndExpect (תוצאה -> assertEquals ("שגיאה פנימית", result.getResolvedException (). GetMessage ())); }

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

5. מסקנה

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

כמו תמיד, קוד המקור המלא של המאמר זמין ב- GitHub.


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