Få og verifisere svardata med REST-forsikret
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 KURSET1. 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å @MockBean på AppService, 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