Testovanie výnimiek pomocou Spring MockMvc

1. Prehľad

V tomto krátkom článku uvidíme, ako by mali byť v našich radičoch vyvolávané výnimky a ako tieto výnimky otestovať pomocou Spring MockMvc.

2. Vyvolávanie výnimiek v radičoch

Začnime sa učiť ako spustiť výnimku z radiča.

O službách, ktoré vystavujeme od radiča, môžeme uvažovať rovnako, ako keby išlo o bežné funkcie Java:

@GetMapping ("/ výnimka / hod") public void getException () hodí výnimku {hodí novú výnimku ("chyba"); } 

Teraz sa pozrime, čo sa stane, keď zavoláme túto službu. Najprv si všimneme, že kód odpovede služby je 500, čo znamená Interná chyba servera.

Po druhé, dostaneme orgán odpovede, ako je tento:

{"timestamp": 1592074599854, "status": 500, "error": "Interná chyba servera", "message": "Nie je k dispozícii žiadna správa", "trace": "java.lang.Exception na com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}

Na záver, keď hodíme výnimku z a RestController, služba sa automaticky namapuje na kód odpovede 500 a trasovanie zásobníka výnimky sa zahrnie do tela odpovede.

3. Mapovanie výnimiek na kódy odpovede HTTP

Teraz sa ideme učiť ako mapovať naše výnimky na rôzne kódy odpovedí iné ako 500.

Aby sme to dosiahli, vytvoríme vlastné výnimky a použijeme Stav odpovede anotácia, ktorú poskytuje Spring. Vytvorme tieto vlastné výnimky:

@ResponseStatus (HttpStatus.BAD_REQUEST) verejná trieda BadArgumentsException rozširuje RuntimeException {public BadArgumentsException (reťazcová správa) {super (správa); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) verejná trieda InternalException rozširuje RuntimeException {public InternalException (reťazcová správa) {super (správa); }}
@ResponseStatus (HttpStatus.NOT_FOUND) verejná trieda ResourceNotFoundException rozširuje RuntimeException {public ResourceNotFoundException (reťazcová správa) {super (správa); }}

Druhým a posledným krokom je vytvorenie jednoduchej služby v našom ovládači, ktorá vyvolá tieto výnimky:

@GetMapping ("/ exception / {exception_id}") public void getSpecificException (@PathVariable ("exception_id") String pException) {if ("not_found" .equals (pException)) {throw new ResourceNotFoundException ("resource not found"); } else if ("bad_arguments" .equals (pException)) {throw new BadArgumentsException ("bad argumenty"); } else {hodit novu InternalException ("interna chyba"); }}

Teraz sa pozrime na rôzne reakcie služby na rôzne výnimky, ktoré sme mapovali:

  • Pre nenájdené, dostaneme kód odpovede 404
  • Vzhľadom na hodnotu zlé_argumenty, dostaneme kód odpovede 400
  • V prípade akejkoľvek inej hodnoty stále dostávame 500 ako kód odpovede

Okrem kódov odpovedí dostaneme text v rovnakom formáte ako text odpovede prijatý v predchádzajúcej časti.

4. Testovanie našich ovládačov

Nakoniec sa ideme pozrieť ako otestovať, že náš kontrolór vyhadzuje správne výnimky.

Prvým krokom je vytvorenie testovacej triedy a vytvorenie inštancie MockMvc:

@Autowired private MockMvc mvc; 

Ďalej vytvoríme testovacie prípady pre každú z hodnôt, ktoré môže naša služba dostať:

@ Test public void givenNotFound_whenGetSpecificException_thenNotFoundCode () vyvolá výnimku {String exceptionParam = "not_found"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)) .andExpect (status (). isNotFound ()) .andExpect (result -> assertTrue (result.getResolvedException () instanceof ResourceNotFoundException)) .andExpect (result -> assertEquals ("zdroj sa nenašiel", result.getResolvedException (). GetMessage ())); } @Test public void givenBadArguments_whenGetSpecificException_thenBadRequest () vyvolá výnimku {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 (result -> assertEquals ("chybne argumenty", result.getResolvedException (). GetMessage ())); } @Test public void givenOther_whenGetSpecificException_thenInternalServerError () vyvolá výnimku {String exceptionParam = "dummy"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)) .andExpect (status (). isInternalServerError ()) .andExpect (result -> assertTrue (result.getResolvedException () instanceof InternalException)) .andExpect (result -> assertEquals ("interná chyba", result.getResolvedException (). GetMessage ())); }

Pomocou týchto testov kontrolujeme, či kód odpovede, typ vyvolanej výnimky a správy týchto výnimiek sú očakávané pre každú z hodnôt.

5. Záver

V tomto tutoriáli sme sa naučili, ako zaobchádzať s výnimkami v našej jarnej časti RestControllers a ako otestovať, že každá exponovaná služba vyvoláva očakávané výnimky.

Úplný zdrojový kód článku je ako vždy k dispozícii na GitHub.