Test af undtagelser med Spring MockMvc

1. Oversigt

I denne korte artikel vil vi se, hvordan undtagelser skal kastes i vores controllere, og hvordan man tester disse undtagelser ved hjælp af Spring MockMvc.

2. Kaste undtagelser i controllere

Lad os begynde at lære hvordan man starter en undtagelse fra en controller.

Vi kan tænke på de tjenester, vi udsætter fra en controller på samme måde som om de var normale Java-funktioner:

@GetMapping ("/ exception / throw") offentligt ugyldigt getException () kaster undtagelse {throw new Exception ("error"); } 

Lad os nu se, hvad der sker, når vi kalder denne service. Først bemærker vi, at servicekoden for tjenesten er 500, hvilket betyder intern serverfejl.

For det andet modtager vi et svarorgan som dette:

{"tidsstempel": 1592074599854, "status": 500, "error": "Intern serverfejl", "message": "Ingen meddelelse tilgængelig", "trace": "java.lang.Exception på com.baeldung.controllers. ExceptionController.getException (ExceptionController.java:26) ... "}

Afslutningsvis når vi kaster en undtagelse fra en RestController, tilknyttes tjenestesvaret automatisk til en 500-svarskode, og stakksporingen af ​​undtagelsen er inkluderet i svaret.

3. Kortlægning af undtagelser fra HTTP-responskoder

Nu skal vi lære hvordan man kortlægger vores undtagelser fra forskellige svarkoder andet end 500.

For at opnå dette skal vi oprette brugerdefinerede undtagelser og bruge ResponseStatus kommentar, der leveres af Spring. Lad os oprette disse brugerdefinerede undtagelser:

@ResponseStatus (HttpStatus.BAD_REQUEST) offentlig klasse BadArgumentsException udvider RuntimeException {public BadArgumentsException (streng besked) {super (besked); }}
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) offentlig klasse InternalException udvider RuntimeException {public InternalException (streng besked) {super (besked); }}
@ResponseStatus (HttpStatus.NOT_FOUND) offentlig klasse ResourceNotFoundException udvider RuntimeException {public ResourceNotFoundException (streng besked) {super (besked); }}

Det andet og sidste trin er at oprette en simpel tjeneste i vores controller til at kaste disse undtagelser:

@GetMapping ("/ exception / {exception_id}") public void getSpecificException (@PathVariable ("exception_id") String pException) {if ("not_found" .equals (pException)) {kast ny ResourceNotFoundException ("ressource ikke fundet"); } ellers hvis ("bad_arguments" .equals (pException)) {throw new BadArgumentsException ("dårlige argumenter"); } ellers {kast ny InternalException ("intern fejl"); }}

Lad os nu se de forskellige svar fra tjenesten for de forskellige undtagelser, som vi kortlagde:

  • Til ikke fundet, vi modtager en svarkode på 404
  • Givet værdien dårlige argumenter, vi modtager en svarkode på 400
  • For enhver anden værdi modtager vi stadig 500 som svarkode

Bortset fra svarkoderne modtager vi et organ med det samme format som svarorganet modtaget i det foregående afsnit.

4. Test af vores controllere

Endelig skal vi se hvordan man tester, at vores controller kaster de korrekte undtagelser.

Det første trin er at oprette en testklasse og oprette en forekomst af MockMvc:

@Autowired privat MockMvc mvc; 

Lad os derefter oprette testcases for hver af de værdier, som vores service kan modtage:

@Test offentlig ugyldighed givenNotFound_whenGetSpecificException_thenNotFoundCode () kaster undtagelse {String exceptionParam = "not_found"; 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 ("ressource ikke fundet", result.getResolvedException (). GetMessage ())); } @Test offentlig ugyldighed givenBadArguments_whenGetSpecificException_thenBadRequest () kaster undtagelse {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)). Og Expect (result -> assertEquals ("dårlige argumenter", result.getResolvedException (). GetMessage ())); } @Test offentlig ugyldighed givetOther_whenGetSpecificException_thenInternalServerError () kaster Undtagelse {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 fejl", result.getResolvedException (). GetMessage ())); }

Med disse tests kontrollerer vi, at svarkoden, den hævede undtagelsestype og meddelelserne om disse undtagelser er de forventede for hver af værdierne.

5. Konklusion

I denne vejledning har vi lært at håndtere undtagelser i vores forår RestControllers og hvordan man tester, at hver eksponeret tjeneste kaster de forventede undtagelser.

Som altid er artiklens fulde kildekode tilgængelig i GitHub.


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