Ruganje RestTemplate u proljeće

1. Uvod

Često se nalazimo s aplikacijama koje izvršavaju neku vrstu web zahtjeva. Što se tiče testiranja ovog ponašanja, imamo nekoliko opcija s Spring aplikacijama.

JaU ovom brzom uputstvu razmotrit ćemo samo nekoliko načina ismijavanja takvih poziva izvedenih samo putem a RestTemplate.

Započet ćemo s testiranjem s Mockito, popularnom rugalicom. Zatim ćemo upotrijebiti Spring Test koji nam pruža mehanizam za stvaranje lažnog poslužitelja za definiranje interakcija poslužitelja.

2. Korištenje Mockito

Mockito bismo mogli iskoristiti za ruganje RestTemplate uopće. Uz ovaj pristup, testiranje naše usluge bilo bi jednostavno kao i bilo koje drugo ispitivanje koje uključuje ruganje.

Pretpostavimo, imamo jednostavan Usluga zaposlenika klase koja podatke o zaposleniku dohvaća putem HTTP-a:

@Service javna klasa EmployeeService {@Autowired private RestTemplate restTemplate; javni zaposlenik getEfficiee (ID niza) {ResponseEntity resp = restTemplate.getForEntity ("// localhost: 8080 / worker /" + id, Employee.class); vratiti resp.getStatusCode () == HttpStatus.OK? resp.getBody (): null; }} 

Primijenimo naš test za prethodni kôd:

@RunWith (MockitoJUnitRunner.class) javna klasa EmployeeServiceTest {@Mock private RestTemplate restTemplate; @InjectMocks private EmployeeService empService = new EmployeeService (); @Test javna praznina givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {Zaposlenik emp = novi zaposlenik (“E001”, "Eric Simmons"); Mockito .when (restTemplate.getForEntity (“// localhost: 8080 / worker / E001”, Employee.class)). ThenReturn (novi ResponseEntity (emp, HttpStatus.OK)); Zaposlenik zaposlenik = empService.getEfficiee (id); Assert.assertEquals (emp, zaposlenik); }}

U gornjoj klasi JUnit testa prvo smo zamolili Mockito da stvori lutku RestTemplate instanci pomoću @Oponašanje bilješka.

Zatim smo označili Usluga zaposlenika primjer s @InjectMocks da se u nju ubrizga lažna instanca.

Konačno, u testnoj metodi definirali smo ponašanje našeg lažnog softvera koristeći Mockitoovu podršku kada / tada.

3. Korištenje proljetnog testa

TheProljetni testni modul uključuje lažni poslužitelj s imenom MockRestServiceServer.Ovim pristupom konfiguriramo poslužitelj da vraća određeni objekt kada se određeni zahtjev pošalje putem našeg RestTemplate primjer. Napokon, možemo provjeri () na toj instanci poslužitelja jesu li ispunjena sva očekivanja ili ne.

MockRestServiceServer zapravo radi presretanjem HTTP API poziva pomoću a MockClientHttpRequestFactory. Na temelju naše konfiguracije kreira popis očekivanih zahtjeva i odgovarajućih odgovora. Kada RestTemplate instanca poziva API, traži zahtjev na svom popisu očekivanja i vraća odgovarajući odgovor.

Dakle, eliminira potrebu za pokretanjem HTTP poslužitelja u bilo kojem drugom priključku za slanje lažnih odgovora.

Stvorimo jednostavan test za isto getEfficiee () primjer korištenja MockRestServiceServer:

@RunWith (SpringRunner.class) @ContextConfiguration (classes = SpringTestConfig.class) javna klasa EmployeeServiceMockRestServiceServerUnitTest {@Autowired private EmployeeService empService; @Autowired private RestTemplate restTemplate; privatni MockRestServiceServer mockServer; private ObjectMapper mapper = novi ObjectMapper (); @Before public void init () {mockServer = MockRestServiceServer.createServer (restTemplate); } @Test javna praznina givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject () () {Zaposlenik emp = novi zaposlenik ("E001", "Eric Simmons"); mockServer.expect (ExpectedCount.once (), requestTo (novi URI ("// localhost: 8080 / zaposlenik / E001"))). andExpect (metoda (HttpMethod.GET)) .andRespond (withStatus (HttpStatus.OK) .contentType (MediaType.APPLICATION_JSON) .body (mapper.writeValueAsString (emp))); Zaposlenik zaposlenik = empService.getEfficiee (id); mockServer.verify (); Assert.assertEquals (emp, zaposlenik); }} 

U prethodnom isječku koristili smo statičke metode iz MockRestRequestMatchers i MockRestResponseCreators definirati očekivanje i odgovor na poziv REST na jasan i čitljiv način:

uvezi statički org.springframework.test.web.client.match.MockRestRequestMatchers. *; uvezi statički org.springframework.test.web.client.response.MockRestResponseCreators. *;

Trebali bismo imati na umu da RestTemplate u testnoj klasi trebao bi biti isti primjerak korišten u Usluga zaposlenika razred. Da bismo to osigurali, definirali smo grah RestTemplate u proljetnoj konfiguraciji i automatski povezali instancu i u testu i u implementaciji:

@Bean public RestTemplate restTemplate () {return new RestTemplate (); }

Korištenje a MockRestServiceServer je vrlo korisno kada pišemo svoje integracijske testove i trebamo se samo rugati vanjskim HTTP pozivima.

4. Zaključak

U ovom kratkom članku razgovarali smo o nekoliko učinkovitih opcija za ismijavanje vanjskih REST API poziva preko HTTP-a tijekom pisanja jediničnih testova.

Izvorni kod za gornji članak dostupan je na GitHubu.