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.