Testing av unntak med Spring MockMvc

1. Oversikt

I denne korte artikkelen vil vi se hvordan unntak skal kastes i kontrollerne våre og hvordan vi kan teste disse unntakene ved hjelp av Spring MockMvc.

2. Kaste unntak i kontrollere

La oss begynne å lære hvordan du starter et unntak fra en kontroller.

Vi kan tenke på tjenestene vi eksponerer fra en kontroller på samme måte som om de var normale Java-funksjoner:

@GetMapping ("/ unntak / kast") offentlig ugyldighet getException () kaster unntak {kast nytt unntak ("feil"); } 

La oss nå se hva som skjer når vi kaller denne tjenesten. Først vil vi legge merke til at svarskoden til tjenesten er 500, noe som betyr intern serverfeil.

For det andre mottar vi et svarorgan som dette:

{"tidsstempel": 1592074599854, "status": 500, "error": "Intern serverfeil", "message": "Ingen melding tilgjengelig", "trace": "java.lang.Exception at com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}

Avslutningsvis når vi kaster et unntak fra a RestControllerblir tjenestesvaret automatisk kartlagt til en 500 responskode, og stabelspor av unntaket er inkludert i svaret.

3. Kartlegging av unntak fra HTTP-responskoder

Nå skal vi lære hvordan vi kan kartlegge unntakene våre fra forskjellige responskoder annet enn 500.

For å oppnå dette skal vi lage tilpassede unntak og bruke ResponseStatus kommentar som er levert av Spring. La oss lage disse tilpassede unntakene:

@ResponseStatus (HttpStatus.BAD_REQUEST) offentlig klasse BadArgumentsException utvider RuntimeException {public BadArgumentsException (strengmelding) {super (melding); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) offentlig klasse InternalException utvider RuntimeException {public InternalException (strengmelding) {super (melding); }}
@ResponseStatus (HttpStatus.NOT_FOUND) offentlig klasse ResourceNotFoundException utvider RuntimeException {public ResourceNotFoundException (strengmelding) {super (melding); }}

Det andre og siste trinnet er å lage en enkel tjeneste i kontrolleren vår for å kaste disse unntakene:

@GetMapping ("/ exception / {exception_id}") public void getSpecificException (@PathVariable ("exception_id") Streng pException) {if ("not_found" .equals (pException)) {kast ny ResourceNotFoundException ("ressurs ikke funnet"); } annet hvis ("bad_arguments" .equals (pException)) {throw new BadArgumentsException ("dårlige argumenter"); } annet {kast ny InternalException ("intern feil"); }}

La oss nå se de forskjellige svarene på tjenesten for de forskjellige unntakene vi kartla:

  • Til ikke funnet, får vi en svarkode på 404
  • Gitt verdien dårlige argumenter, får vi en svarkode på 400
  • For enhver annen verdi mottar vi fortsatt 500 som svarkode

Bortsett fra responskodene, mottar vi et organ med samme format som svarorganet mottatt i forrige avsnitt.

4. Testing av kontrollerne våre

Endelig skal vi se hvordan vi kan teste at kontrolleren vår kaster de riktige unntakene.

Det første trinnet er å opprette en testklasse og opprette en forekomst av MockMvc:

@Autowired privat MockMvc mvc; 

Deretter la oss lage testtilfeller for hver av verdiene som tjenesten vår kan motta:

@Test offentlig ugyldighet givenNotFound_whenGetSpecificException_thenNotFoundCode () kaster unntak {String exceptionParam = "ikke_funnet"; mvc.perform (get ("/ exception / {exception_id}", exceptionParam) .contentType (MediaType.APPLICATION_JSON)). andExpect (status (). isNotFound ()). andExpect (result -> assertTrue (result.getResolvedException () instanceof ResourceNotFoundException)). Og Expect (resultat -> assertEquals ("ressurs ikke funnet", result.getResolvedException (). GetMessage ())); } @Test offentlig ugyldighet givenBadArguments_whenGetSpecificException_thenBadRequest () kaster unntak {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 ("dårlige argumenter", result.getResolvedException (). GetMessage ())); } @Test offentlig ugyldighet gittOther_whenGetSpecificException_thenInternalServerError () kaster Unntak {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 feil", result.getResolvedException (). GetMessage ())); }

Med disse testene sjekker vi at responskoden, typen hevet unntak og meldingene til de unntakene er de forventede for hver av verdiene.

5. Konklusjon

I denne opplæringen har vi lært å håndtere unntak på våren RestControllers og hvordan man kan teste at hver eksponert tjeneste gir de forventede unntakene.

Som alltid er artikkelens fulle kildekode tilgjengelig i GitHub.


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