Testiranje iznimki s Spring MockMvc

1. Pregled

U ovom kratkom članku vidjet ćemo kako se iznimke trebaju ubaciti u naše kontrolere i kako ih testirati pomoću Spring MockMvc.

2. Bacanje iznimaka u kontrolere

Krenimo s učenjem kako pokrenuti iznimku iz kontrolera.

O uslugama koje izlažemo iz kontrolera možemo razmišljati na isti način kao da su to normalne Java funkcije:

@GetMapping ("/ iznimka / bacanje") javna void getException () baca iznimku {bacanje nove iznimke ("pogreška"); } 

Sada, da vidimo što će se dogoditi kad nazovemo ovu uslugu. Prvo ćemo primijetiti da je odgovor koda usluge 500, što znači Interna pogreška poslužitelja.

Drugo, primamo tijelo odgovora poput ovog:

{"timestamp": 1592074599854, "status": 500, "error": "Interna pogreška poslužitelja", "message": "No message available", "trace": "java.lang.Exception at com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}

U zaključku, kada bacimo iznimku iz a RestController, odgovor usluge automatski se preslikava na kod odgovora 500, a trag stoga iznimke uključuje se u tijelo odgovora.

3. Mapiranje iznimki na HTTP kodove odgovora

Sad ćemo naučiti kako preslikati naše iznimke na različite kodove odgovora osim 500.

Da bismo to postigli, stvorit ćemo prilagođene iznimke i koristiti ResponseStatus napomena koju pruža Spring. Stvorimo one prilagođene iznimke:

@ResponseStatus (HttpStatus.BAD_REQUEST) javna klasa BadArgumentsException proširuje RuntimeException {public BadArgumentsException (niz poruka) {super (poruka); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) javna klasa InternalException proširuje RuntimeException {public InternalException (niz poruka) {super (poruka); }}
@ResponseStatus (HttpStatus.NOT_FOUND) javna klasa ResourceNotFoundException proširuje RuntimeException {public ResourceNotFoundException (String message) {super (poruka); }}

Drugi i posljednji korak je stvaranje jednostavne usluge u našem kontroleru za uklanjanje ovih iznimaka:

@GetMapping ("/ iznimka / {iznimka_id}") javna void getSpecificException (@PathVariable ("iznimka_id") String pException) {if ("not_found" .equals (pException)) {throw new ResourceNotFoundException ("resource not found"); } else if ("bad_arguments" .equals (pException)) {throw new BadArgumentsException ("loši argumenti"); } else {baciti novi InternalException ("unutarnja pogreška"); }}

Pogledajmo sada različite odgovore usluge za različite iznimke koje smo mapirali:

  • Za nije pronađeno, primamo šifru odgovora 404
  • S obzirom na vrijednost loši_argumenti, primamo šifru odgovora od 400
  • Za bilo koju drugu vrijednost i dalje dobivamo 500 kao kod odgovora

Osim kodova odgovora, primit ćemo tijelo istog formata kao tijelo odgovora primljeno u prethodnom odjeljku.

4. Testiranje naših kontrolera

Napokon ćemo vidjeti kako testirati da naš kontroler daje ispravne iznimke.

Prvi korak je stvaranje testne klase i izrada instance MockMvc:

@Autowired private MockMvc mvc; 

Dalje, kreirajmo test slučajeve za svaku od vrijednosti koje naša usluga može primiti:

@Test javna praznina givenNotFound_whenGetSpecificException_thenNotFoundCode () baca iznimku {String exceptionParam = "not_found"; mvc.perform (get ("/ iznimka / {iznimka_id}", iznimkaParam) .contentType (MediaType.APPLICATION_JSON)) .andExpect (status (). isNotFound ()) .andExpect (result -> assertTrue (result.getResolvedException () instanceof) ResourceNotFoundException)) .andExpect (rezultat -> assertEquals ("resurs nije pronađen", result.getResolvedException (). GetMessage ())); } @Test javna praznina givenBadArguments_whenGetSpecificException_thenBadRequest () baca iznimku {String exceptionParam = "bad_arguments"; mvc.perform (get ("/ iznimka / {iznimka_id}", iznimkaParam) .contentType (MediaType.APPLICATION_JSON)) .andExpect (status (). isBadRequest ()) .andExpect (result -> assertTrue (result.getResolvedException () instanceof) BadArgumentsException)) .andExpect (rezultat -> assertEquals ("loši argumenti", result.getResolvedException (). GetMessage ())); } @Test javna praznina givenOther_whenGetSpecificException_thenInternalServerError () baca iznimku {String exceptionParam = "dummy"; mvc.perform (get ("/ iznimka / {izuzetak_id}", iznimkaParam) .contentType (MediaType.APPLICATION_JSON)) .andExpect (status (). isInternalServerError ()) .andExpect (rezultat -> assertTrue (result.getResolvedException InternalException)) .andExpect (rezultat -> assertEquals ("unutarnja pogreška", result.getResolvedException (). GetMessage ())); }

Ovim testovima provjeravamo jesu li kod odgovora, vrsta izuzetaka i poruke tih izuzetaka očekivane za svaku od vrijednosti.

5. Zaključak

U ovom uputstvu naučili smo kako se nositi s iznimkama u proljeće RestControllers i kako testirati da li svaka izložena usluga baca očekivane iznimke.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHubu.


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