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.