Spotter en hviletemplate om foråret

1. Introduktion

Ofte finder vi os selv med applikationer, der udfører en slags webanmodning. Når det kommer til at teste denne adfærd, har vi et par muligheder med Spring-apps.

jegn denne hurtige vejledning ser vi på et par måder at spotte sådanne opkald udført kun gennem a RestTemplate.

Vi begynder at teste med Mockito, et populært mocking-bibliotek. Derefter bruger vi Spring Test, som giver os en mekanisme til at oprette en mock-server til at definere serverinteraktioner.

2. Brug Mockito

Vi kunne bruge Mockito til at spotte RestTemplate helt. Med denne tilgang ville det være så simpelt at teste vores service som enhver anden test, der involverer hån.

Lad os antage, at vi har en simpel Medarbejderstjeneste klasse, som henter medarbejderoplysninger via HTTP:

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

Lad os implementere vores test for den forrige kode:

@RunWith (MockitoJUnitRunner.class) offentlig klasse EmployeeServiceTest {@Mock privat RestTemplate restTemplate; @InjectMocks private EmployeeService empService = ny EmployeeService (); @ Test offentlig ugyldighed givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {Medarbejder emp = ny medarbejder (“E001”, "Eric Simmons"); Mockito .when (restTemplate.getForEntity (“// localhost: 8080 / medarbejder / E001”, Medarbejder.klasse)) .thenReturn (ny ResponseEntity (emp, HttpStatus.OK)); Medarbejdermedarbejder = empService.getEmployee (id); Assert.assertEquals (emp, medarbejder); }}

I ovenstående JUnit testklasse har vi først bedt Mockito om at oprette en dummy RestTemplate eksempel ved hjælp af @Mock kommentar.

Derefter har vi kommenteret Medarbejderstjeneste eksempel med @InjectMocks at injicere dummy-instansen i den.

Endelig har vi i testmetoden defineret vores mocks opførsel ved hjælp af Mockitos når / derefter support.

3. Brug af forårstest

DetSpring Test-modul inkluderer en mock-server med navnet MockRestServiceServer.Med denne tilgang konfigurerer vi serveren til at returnere et bestemt objekt, når en bestemt anmodning sendes gennem vores RestTemplate eksempel. Endelig kan vi verificere() på den serverinstans, om alle forventninger er opfyldt eller ej.

MockRestServiceServer fungerer faktisk ved at opfange HTTP API-opkald ved hjælp af en MockClientHttpRequestFactory. Baseret på vores konfiguration opretter den en liste over forventede anmodninger og tilsvarende svar. Når RestTemplate eksempel kalder API, det ser op på anmodningen i sin liste over forventninger og returnerer det tilsvarende svar.

Således eliminerer det behovet for at køre en HTTP-server i enhver anden port til at sende mock-svar.

Lad os oprette en simpel test for det samme getEmployee () eksempel ved hjælp af MockRestServiceServer:

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

I det forrige uddrag brugte vi statiske metoder fra in MockRestRequestMatchers og MockRestResponseCreators at definere forventningen og svaret til REST-opkaldet på en klar og læselig måde:

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

Vi skal huske på, at RestTemplate i testklassen skal være den samme forekomst, der bruges i Medarbejderstjeneste klasse. For at sikre, at vi har defineret en RestTemplate-bønne i forårskonfigurationen og automatisk tilsluttet forekomsten i både test og implementering:

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

Brug af en MockRestServiceServer er meget nyttigt, når vi skriver vores integrationstest og kun har brug for at spotte eksterne HTTP-opkald.

4. Konklusion

I denne korte artikel har vi diskuteret et par effektive muligheder for at spotte de eksterne REST API-opkald via HTTP, mens vi skriver enhedstest.

Kildekoden til ovenstående artikel er tilgængelig på GitHub.


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