Få og verificere svardata med REST-sikret

REST Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne vejledning diskuterer vi, hvordan du tester REST-tjenester ved hjælp af REST-forsikret med fokus på indfange og validere svardata fra vores REST API'er.

2. Opsætning til testklassen

I tidligere tutorials har vi generelt udforsket REST-forsikret, og vi har vist, hvordan man manipulerer anmodningsoverskrifter, cookies og parametre.

På baggrund af denne eksisterende opsætning har vi tilføjet en simpel REST-controller, AppController, der internt kalder en tjeneste, AppService. Vi bruger disse klasser i vores testeksempler.

For at oprette vores testklasse er vi nødt til at gøre lidt mere opsætning. Da vi har gjort det spring-boot-starter-test i vores klassesti kan vi nemt udnytte Spring Test-hjælpeprogrammer.

Lad os først oprette vores skelet 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; // test tilfælde}

I denne JUnit-test annoterede vi vores klasse med et par forårsspecifikke annoteringer, der spinder applikationen lokalt op i en tilfældig tilgængelig port. I @PostConstruct, vi fangede den fulde URI, hvorpå vi foretager REST-opkald.

Vi brugte også @MockBeanAppService, da vi har brug for at spotte metode, kalder denne klasse.

3. Validering af JSON-svaret

JSON er det mest almindelige format, der bruges i REST API'er til udveksling af data. Svar kan bestå af et enkelt JSON-objekt eller en matrix af JSON-objekter. Vi ser på begge dele i dette afsnit.

3.1. Enkelt JSON-objekt

Lad os sige, at vi skal teste / film / {id} slutpunkt, som returnerer a Film JSON-objekt, hvis id er fundet.

Vi håner AppService opfordrer til at returnere nogle mock-data ved hjælp af Mockito-rammen:

@Test offentlig ugyldighed givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie () {Film testMovie = ny film (1, "movie1", "resume1"); når (appService.findMovie (1)). derefterReturn (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 spottede vi først appService.findMovie (1) kald for at returnere et objekt. Derefter konstruerede vi vores REST URL i få() metode leveret af REST-sikret til at foretage GET-anmodninger. Endelig fremsatte vi fire påstande.

Først, vi kontrollerede svarets statuskode og derefter legeme elementer. Vi bruger Hamcrest til at hævde den forventede værdi.

Bemærk også, at hvis svaret JSON er indlejret, kan vi teste en indlejret nøgle ved hjælp af prik operatør som “Key1.key2.key3”.

3.2. Uddrag af JSON-svaret efter validering

I nogle tilfælde kan det være nødvendigt at udtrække svaret efter validering for at udføre yderligere handlinger på det.

Vi kan udtrække JSON-svaret til en klasse ved hjælp af uddrag() metode:

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

I dette eksempel instruerede vi REST-forsikret om at udtrække JSON-svaret på en Film objekt og derefter hævdet på det udpakkede objekt.

Vi kan også udtrække hele svaret på en Snor, bruger udtræk (). asString () API:

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

Langt om længe, vi kan også udtrække et bestemt felt ud af svaret JSON.

Lad os se på en test for en POST API, der forventer en Film JSON-krop og returnerer det samme, hvis det er indsat med succes:

@Test offentlig ugyldighed givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect () {Mapanmodning = ny HashMap (); request.put ("id", "11"); request.put ("navn", "film1"); request.put ("synopsis", "summary1"); int movieId = given (). contentType ("application / json") .body (anmodning) .when () .post (uri + "/ film"). derefter () .assertThat () .statusCode (HttpStatus.CREATED.value ()) .extract () .path ("id"); assertThat (movieId) .isEqualTo (11); }

Ovenfor lavede vi først anmodningsobjektet, som vi skal POSTE. Vi ekstraherede derefter id felt fra det returnerede JSON-svar ved hjælp af sti() metode.

3.3. JSON Array

Vi kan også kontrollere svaret, hvis det er et JSON-array:

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

Vi spottede igen først appService.getAll () med nogle data og fremsatte en anmodning til vores slutpunkt. Vi hævdede derefter statusKode og størrelse af vores respons array.

Dette kan igen gøres via ekstraktion:

Film [] film = get (uri + "/ film"). Derefter () .statusCode (200) .ekstrakt () .as (Film []. Klasse); assertThat (film.længde) .isEqualTo (2);

4. Validering af overskrifter og cookies

Vi kan verificere en header eller cookie af svaret ved hjælp af metoder med samme navn:

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

Vi kan også udtrække overskrifter og cookies individuelt:

Svarrespons = get (uri + "/ velkommen"); String headerName = respons.getHeader ("sessionId"); String cookieValue = respons.getCookie ("token"); assertThat (headerName) .isNotBlank (); assertThat (cookieValue) .isNotBlank ();

5. Validering af filer

Hvis vores REST API returnerer en fil, kan vi bruge asByteArray () metode til at udtrække svaret:

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

Her hånede vi først appService.getFile (1) at returnere en tekstfil, der findes i vores src / test / ressourcer sti. Vi ringede derefter op til vores slutpunkt og hentede svaret i a byte [], som vi derefter hævdede at have den forventede værdi.

6. Konklusion

I denne vejledning undersøgte vi forskellige måder at indfange og validere svar fra vores REST API'er ved hjælp af REST-forsikret.

Som sædvanlig er koden i denne artikel tilgængelig på Github.

REST bunden

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN