Spott med en hvilemodell om våren

1. Introduksjon

Ofte finner vi oss selv med applikasjoner som utfører en slags nettforespørsel. Når det gjelder å teste denne oppførselen, har vi noen alternativer med Spring-apper.

JegI denne raske opplæringen vil vi se på bare noen få måter å spotte slike samtaler utført bare gjennom a RestTemplate.

Vi begynner å teste med Mockito, et populært hånebibliotek. Deretter bruker vi Spring Test som gir oss en mekanisme for å lage en mock-server for å definere serverinteraksjoner.

2. Bruke Mockito

Vi kan bruke Mockito til å spotte RestTemplate helt. Med denne tilnærmingen vil testing av tjenesten vår være så enkel som enhver annen test som involverer spott.

La oss anta at vi har en enkel EmployeeService klasse, som henter medarbeideropplysninger gjennom HTTP:

@Service offentlig klasse EmployeeService {@Autowired private RestTemplate restTemplate; offentlig ansatt getEmployee (String id) {ResponseEntity resp = restTemplate.getForEntity ("// localhost: 8080 / employee /" + id, Employee.class); returnere resp.getStatusCode () == HttpStatus.OK? resp.getBody (): null; }} 

La oss implementere testen for forrige kode:

@RunWith (MockitoJUnitRunner.class) offentlig klasse EmployeeServiceTest {@Mock private RestTemplate restTemplate; @InjectMocks private EmployeeService empService = ny EmployeeService (); @Test offentlig ugyldig givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {Employee emp = new Employee (“E001”, "Eric Simmons"); Mockito. Når (restTemplate.getForEntity (“// localhost: 8080 / ansatt / E001”, ansatt.klasse)) .thenReturn (ny ResponseEntity (emp, HttpStatus.OK)); Ansatt ansatt = empService.getEmployee (id); Assert.assertEquals (emp, ansatt); }}

I ovennevnte JUnit-testklasse har vi først bedt Mockito om å lage en dummy RestTemplate instans ved hjelp @Håne kommentar.

Så har vi kommentert EmployeeService eksempel med @InjectMocks å injisere dummyforekomsten i den.

Til slutt, i testmetoden, har vi definert oppførselen til mocken vår ved hjelp av Mockitos når / da-støtte.

3. Bruke vårtest

DeVårtestmodul inkluderer en mock-server som heter MockRestServiceServer.Med denne tilnærmingen konfigurerer vi serveren til å returnere et bestemt objekt når en spesifikk forespørsel sendes gjennom vår RestTemplate forekomst. Endelig kan vi bekrefte() på den serverinstansen om alle forventningene er oppfylt eller ikke.

MockRestServiceServer fungerer faktisk ved å avlytte HTTP API-samtaler ved hjelp av en MockClientHttpRequestFactory. Basert på vår konfigurasjon oppretter den en liste over forventede forespørsler og tilsvarende svar. Når RestTemplate forekomst kaller API, det ser opp forespørselen i forventningslisten og returnerer tilsvarende svar.

Dermed eliminerer det behovet for å kjøre en HTTP-server i en hvilken som helst annen port for å sende mock-svar.

La oss lage en enkel test for det samme getEmployee () eksempel bruker MockRestServiceServer:

@RunWith (SpringRunner.class) @ContextConfiguration (klasser = SpringTestConfig.class) offentlig klasse EmployeeServiceMockRestServiceServerUnitTest {@Autowired private EmployeeService empService; @Autowired private RestTemplate restTemplate; privat MockRestServiceServer mockServer; privat ObjectMapper-kartlegger = ny ObjectMapper (); @Før offentlig ugyldig init () {mockServer = MockRestServiceServer.createServer (restTemplate); } @Test offentlig ugyldig givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject () () {Employee emp = new Employee ("E001", "Eric Simmons"); mockServer.expect (ExpectedCount.once (), requestTo (ny URI ("// localhost: 8080 / ansatt / E001"))). og Expect (metode (HttpMethod.GET)) .andRespond (withStatus (HttpStatus.OK) .contentType (MediaType.APPLICATION_JSON) .body (mapper.writeValueAsString (emp))); Ansatt ansatt = empService.getEmployee (id); mockServer.verify (); Assert.assertEquals (emp, ansatt); }} 

I forrige utdrag brukte vi statiske metoder fra in MockRestRequestMatchers og MockRestResponseCreators å definere forventning og respons for REST-samtalen på en klar og lesbar måte:

importer statisk org.springframework.test.web.client.match.MockRestRequestMatchers. *; importer statisk org.springframework.test.web.client.response.MockRestResponseCreators. *;

Vi bør huske på at RestTemplate i testklassen skal være den samme forekomsten som brukes i EmployeeService klasse. For å sikre at vi har definert en RestTemplate-bønne i vårkonfigurasjonen og automatisk koblet forekomsten i både test og implementering:

@Bean public RestTemplate restTemplate () {returner ny RestTemplate (); }

Bruker en MockRestServiceServer er veldig nyttig når vi skriver integrasjonstestene våre og bare trenger å spotte eksterne HTTP-anrop.

4. Konklusjon

I denne korte artikkelen har vi diskutert noen få effektive alternativer for å spotte de eksterne REST API-anropene via HTTP mens vi skriver enhetstester.

Kildekoden for artikkelen ovenfor er tilgjengelig på GitHub.


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