Kivételek tesztelése a Spring MockMvc segítségével
1. Áttekintés
Ebben a rövid cikkben megnézzük, hogyan kell a kivételeket bedobni a vezérlőinkbe, és hogyan lehet ezeket tesztelni a Spring MockMvc segítségével.
2. Kivételek dobása a vezérlőkben
Kezdjük el a tanulást hogyan lehet kivételt indítani egy vezérlőtől.
Ugyanúgy gondolhatunk azokra a szolgáltatásokra, amelyeket egy vezérlőtől teszünk ki, mintha normál Java-funkciók lennének:
@GetMapping ("/ kivétel / dobás") public void getException () dobja a Kivételt {dobjon új Kivételt ("hiba"); }
Most nézzük meg, mi történik, amikor felhívjuk ezt a szolgáltatást. Először észrevesszük, hogy a szolgáltatás válaszkódja 500, ami belső kiszolgáló hibát jelent.
Másodszor egy ilyen válaszoló testületet kapunk:
{"timestamp": 1592074599854, "status": 500, "error": "Internal Server Error", "message": "No message available", "trace": "java.lang.Exception at com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}
Összegzésképpen, amikor kivételt vetünk a RestController, a szolgáltatás válasza automatikusan leképezésre kerül egy 500 válaszkódra, és a kivétel veremnyoma bekerül a választestbe.
3. Kivételek feltérképezése a HTTP válaszkódokhoz
Most megtanuljuk hogyan lehet leképezni a kivételeket a különböző válaszkódokra 500-tól eltérő.
Ennek elérése érdekében egyedi kivételeket hozunk létre, és használjuk a ResponseStatus a tavaszi kommentár. Hozzuk létre ezeket az egyedi kivételeket:
@ResponseStatus (HttpStatus.BAD_REQUEST) nyilvános osztály BadArgumentsException kiterjeszti a RuntimeException {public BadArgumentsException (String üzenet) {super (üzenet); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) public class InternalException kiterjeszti a RuntimeException {public InternalException (String üzenet) {super (message); }}
@ResponseStatus (HttpStatus.NOT_FOUND) nyilvános osztály A ResourceNotFoundException kiterjeszti a RuntimeException {public ResourceNotFoundException (String üzenet) {super (üzenet); }}
A második és az utolsó lépés egy egyszerű szolgáltatás létrehozása a vezérlőnkben, amely a következő kivételeket tartalmazza:
@GetMapping ("/ kivétel / {kivétel_id}") public void getSpecificException (@PathVariable ("kivétel_id") Karakterlánc pException) {if ("not_found" .equals (pException)) {dobjon új ResourceNotFoundException ("erőforrás nem található"); } else if ("bad_arguments" .equals (pException)) {dobjon új BadArgumentsException-t ("rossz érvek"); } else {dob új InternalException-t ("belső hiba"); }}
Most nézzük meg a szolgáltatás különböző válaszait a feltérképezett különböző kivételekre:
- Mert nem található, 404-es válaszkódot kapunk
- Adva az érték rossz_argumentumok, 400-as válaszkódot kapunk
- Bármely más érték esetén továbbra is 500-at kapunk válaszkódként
A válaszkódokon kívül kapunk egy testet, amelynek formátuma megegyezik az előző szakaszban kapott választesttel.
4. Vezérlőink tesztelése
Végül meglátjuk hogyan tesztelhetjük, hogy vezérlőnk a helyes kivételeket dobja-e.
Az első lépés egy tesztosztály létrehozása és egy példányának létrehozása MockMvc:
@Autowired privát MockMvc mvc;
Ezután hozzuk létre a teszteseteket minden olyan értékhez, amelyet szolgáltatásunk megkap:
@Test public void givenNotFound_whenGetSpecificException_thenNotFoundCode () dobja a (z) {String kivételParam = "not_found" kivételt; mvc.perform (get ("/ kivétel / {kivétel_id}", kivételParam) .contentType (MediaType.APPLICATION_JSON)) .ésExpect (állapot (). isNotFound ()) .andExpect (eredmény -> assertTrue (result.getResolvedException () instanceof ResourceNotFoundException)) .andExpect (eredmény -> assertEquals ("erőforrás nem található", result.getResolvedException (). GetMessage ())); } @Test public void givenBadArguments_whenGetSpecificException_thenBadRequest () dobja a Kivételt {String kivételParam = "rossz_argumentumok"; mvc.perform (get ("/ kivétel / {kivétel_id}", kivételParam) .contentType (MediaType.APPLICATION_JSON)) .ésExpect (status (). isBadRequest ()) .andExpect (eredmény -> assertTrue (result.getResolvedException () instanceof) BadArgumentsException)) .andExpect (eredmény -> assertEquals ("rossz érvek", result.getResolvedException (). GetMessage ())); } @Test public void givenOther_whenGetSpecificException_thenInternalServerError () dobja a Kivételt {String kivételParam = "dummy"; mvc.perform (get ("/ kivétel / {kivétel_id}", kivételParam) .contentType (MediaType.APPLICATION_JSON)) .ésExpect (állapot (). isInternalServerError ()) .ésExpect (eredmény -> assertTrue (eredmény.getResolvedException) InternalException)) .andExpect (eredmény -> assertEquals ("belső hiba", result.getResolvedException (). GetMessage ())); }
Ezekkel a tesztekkel ellenőrizzük, hogy a válaszkód, a felvetett kivétel típusa és a kivételek üzenetei az egyes értékek várható elvárásai.
5. Következtetés
Ebben az oktatóanyagban megtanultuk, hogyan kell kezelni a kivételeket tavasszal RestControllers azt, hogy miként lehet tesztelni, hogy minden egyes kitett szolgáltatás eldobja-e a várható kivételeket.
Mint mindig, a cikk teljes forráskódja a GitHubban érhető el.