Få og verifisere svardata med REST-forsikret

REST Topp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

I denne opplæringen vil vi diskutere hvordan du tester REST-tjenester ved hjelp av REST-forsikret, med fokus på fange og validere responsdataene fra REST API-ene våre.

2. Oppsett for testklassen

I tidligere veiledninger har vi utforsket REST-forsikret generelt, og vi har vist hvordan man kan manipulere forespørselsoverskrifter, informasjonskapsler og parametere.

Basert på dette eksisterende oppsettet, har vi lagt til en enkel REST-kontroller, AppController, som internt kaller en tjeneste, AppService. Vi bruker disse klassene i testeksemplene våre.

For å lage testklassen vår, må vi gjøre litt mer oppsett. Siden vi har gjort det vår-støvel-start-test i klassestien vår kan vi enkelt utnytte vårtestverktøy.

La oss først lage skjelettet til vårt AppControllerIntegrationTest klasse:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) offentlig klasse AppControllerIntegrationTest {@LocalServerPort privat int-port; private String uri; @PostConstruct public void init () {uri = "// localhost:" + port; } @MockBean AppService appService; // prøvesaker}

I denne JUnit-testen kommenterte vi klassen vår med et par vårspesifikke merknader som snurrer opp applikasjonen lokalt i en tilfeldig tilgjengelig port. I @PostConstruct, vi fanget hele URI-en som vi skal ringe REST på.

Vi brukte også @MockBeanAppService, som vi må spotte metoden, påkaller denne klassen.

3. Validering av JSON-svaret

JSON er det vanligste formatet som brukes i REST APIer for å utveksle data. Svarene kan bestå av et enkelt JSON-objekt eller en rekke JSON-objekter. Vi ser på begge deler i denne delen.

3.1. Enkelt JSON-objekt

La oss si at vi må teste / film / {id} endepunkt, som returnerer a Film JSON-objekt hvis id er funnet.

Vi håner AppService ringer for å returnere noen mock-data ved hjelp av Mockito-rammeverket:

@Test offentlig ugyldig givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie () {Movie testMovie = new Movie (1, "movie1", "summary1"); når (appService.findMovie (1)). deretterReturn (testMovie); get (uri + "/ movie /" + testMovie.getId ()). then () .assertThat () .statusCode (HttpStatus.OK.value ()) .body ("id", equalTo (testMovie.getId ()) ) .body ("name", equalTo (testMovie.getName ())) .body ("synopsis", notNullValue ()); }

Ovenfor spottet vi først appService.findMovie (1) ring for å returnere et objekt. Deretter konstruerte vi vår REST URL i få() metoden levert av REST-forsikret for å komme med GET-forespørsler. Til slutt kom vi med fire påstander.

Først, vi sjekket responsstatuskoden og deretter kropp elementer. Vi bruker Hamcrest for å hevde den forventede verdien.

Vær også oppmerksom på at hvis svaret JSON er nestet, kan vi teste en nestet nøkkel ved å bruke punktum operatør som “Key1.key2.key3”.

3.2. Pakke ut JSON-svaret etter validering

I noen tilfeller kan det hende vi trenger å trekke ut svaret etter validering, for å utføre flere operasjoner på det.

Vi kan trekke ut JSON-svaret til en klasse ved hjelp av ekstrakt() metode:

Filmresultat = get (uri + "/ movie /" + testMovie.getId ()). Deretter () .assertThat () .statusCode (HttpStatus.OK.value ()) .extract () .as (Movie.class); assertThat (resultat) .isEqualTo (testMovie);

I dette eksemplet instruerte vi REST-forsikret om å trekke ut JSON-svaret på a Film objektet og deretter hevdet på det ekstraherte objektet.

Vi kan også trekke ut hele svaret på en Streng, bruker pakke ut (). asString () API:

String responseString = get (uri + "/ movie /" + testMovie.getId ()). Deretter () .assertThat () .statusCode (HttpStatus.OK.value ()) .extract () .asString (); assertThat (responseString) .isNotEmpty ();

Endelig, vi kan også trekke ut et bestemt felt fra svaret JSON.

La oss se på en test for et POST API som forventer en Film JSON-kroppen og vil returnere den samme hvis den er satt inn vellykket:

@Test offentlig ugyldig givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect () {Map request = new HashMap (); request.put ("id", "11"); request.put ("navn", "movie1"); request.put ("synopsis", "summary1"); int movieId = given (). contentType ("application / json") .body (request) .when () .post (uri + "/ movie") .then () .assertThat () .statusCode (HttpStatus.CREATED.value ()) .extract () .path ("id"); assertThat (movieId) .isEqualTo (11); }

Ovenfor laget vi først forespørselsobjektet som vi trenger å POSTE. Vi hentet deretter ut id fra det returnerte JSON-svaret ved hjelp av sti() metode.

3.3. JSON Array

Vi kan også bekrefte svaret hvis det er et JSON-utvalg:

@Test offentlig ugyldig nårCallingMoviesEndpoint_thenReturnAllMovies () {Set movieSet = new HashSet (); movieSet.add (ny film (1, "film1", "sammendrag1")); movieSet.add (ny film (2, "film2", "sammendrag2")); når (appService.getAll ()). thenReturn (movieSet); få (uri + "/ filmer"). deretter () .statusCode (HttpStatus.OK.value ()) .assertThat () .body ("størrelse ()", er (2)); }

Vi spottet igjen først appService.getAll () med noen data og sendte en forespørsel til vårt endepunkt. Vi hevdet deretter statusKode og størrelse av vårt responsarray.

Dette kan igjen gjøres via ekstraksjon:

Film [] filmer = get (uri + "/ filmer"). Deretter () .statusCode (200) .utdrag () .as (Film []. Klasse); assertThat (films.length) .isEqualTo (2);

4. Validerende overskrifter og informasjonskapsler

Vi kan verifisere en overskrift eller informasjonskapsel for svaret ved hjelp av metoder med samme navn:

@Test offentlig ugyldig nårCallingWelcomeEndpoint_thenCorrect () {get (uri + "/ welcome"). Deretter () .assertThat () .header ("sessionId", notNullValue ()) .cookie ("token", notNullValue ()); }

Vi kan også trekke ut topptekstene og informasjonskapslene hver for seg:

Svarrespons = få (uri + "/ velkomst"); String headerName = response.getHeader ("sessionId"); String cookieValue = respons.getCookie ("token"); assertThat (headerName) .isNotBlank (); assertThat (cookieValue) .isNotBlank ();

5. Validering av filer

Hvis REST API-en vår returnerer en fil, kan vi bruke asByteArray () metode for å trekke ut svaret:

Filfil = ny ClassPathResource ("test.txt"). GetFile (); lang fileSize = file.length (); når (appService.getFile (1)). deretterReturn (fil); byte [] resultat = get (uri + "/ nedlasting / 1"). asByteArray (); assertThat (result.length) .isEqualTo (fileSize);

Her spottet vi først appService.getFile (1) å returnere en tekstfil som er tilstede i vår src / test / ressurser sti. Vi ringte deretter til endepunktet vårt og hentet svaret i a byte [], som vi deretter hevdet å ha den forventede verdien.

6. Konklusjon

I denne opplæringen så vi på forskjellige måter å fange og validere svar fra REST API-ene våre ved hjelp av REST-forsikret.

Som vanlig er koden i denne artikkelen tilgjengelig på Github.

HVILLE bunnen

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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