Na jar vysmievanie tabuľky RestTemplate

1. Úvod

Často sa stretávame s aplikáciami, ktoré vykonávajú určitý druh webových požiadaviek. Pokiaľ ide o testovanie tohto správania, máme niekoľko možností s jarnými aplikáciami.

JaV tomto rýchlom výučbe sa pozrieme na niekoľko spôsobov zosmiešňovania hovorov uskutočňovaných iba prostredníctvom čísla a RestTemplate.

Začneme testovať s Mockitom, populárnou posmešnou knižnicou. Potom použijeme Spring Test, ktorý nám poskytne mechanizmus na vytvorenie falošného servera na definovanie interakcií so serverom.

2. Pomocou Mockito

Mohli by sme použiť Mockito na zosmiešnenie RestTemplate celkom. S týmto prístupom by bolo testovanie našej služby rovnako jednoduché ako každé iné testovanie zahŕňajúce zosmiešňovanie.

Predpokladajme, že máme jednoduchý EmployeeService trieda, ktorá načítava podrobnosti o zamestnancovi prostredníctvom protokolu HTTP:

@Service verejná trieda EmployeeService {@Autowired private RestTemplate restTemplate; public Employee getEmployee (String id) {ResponseEntity resp = restTemplate.getForEntity ("// localhost: 8080 / employee /" + id, Employee.class); vrátiť resp.getStatusCode () == HttpStatus.OK? resp.getBody (): null; }} 

Implementujme náš test pre predchádzajúci kód:

@RunWith (MockitoJUnitRunner.class) verejná trieda EmployeeServiceTest {@Mock private RestTemplate restTemplate; @InjectMocks private EmployeeService empService = nový EmployeeService (); @Test public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {Employee emp = new Employee („E001“, „Eric Simmons“); Mockito .when (restTemplate.getForEntity („// localhost: 8080 / employee / E001“, Employee.class)) .thenReturn (new ResponseEntity (emp, HttpStatus.OK)); Zamestnanec zamestnanec = empService.getEmployee (id); Assert.assertEquals (emp, zamestnanec); }}

Vo vyššie uvedenej testovacej triede JUnit sme najskôr požiadali spoločnosť Mockito, aby vytvorila figurínu RestTemplate napríklad pomocou @Mock anotácia.

Potom sme anotovali EmployeeService napríklad s @InjectMocks vložiť do nej figurínu.

Nakoniec sme v testovacej metóde definovali správanie nášho falošného nástroja pomocou podpory Mockito, keď / potom.

3. Používanie jarného testu

TheModul Spring Test obsahuje falošný server s názvom MockRestServiceServer.S týmto prístupom nakonfigurujeme server tak, aby vrátil konkrétny objekt, keď je prostredníctvom našej adresy odoslaná konkrétna požiadavka RestTemplate inštancia. Nakoniec môžeme overiť () na tejto inštancii servera, či boli alebo neboli splnené všetky očakávania.

MockRestServiceServer v skutočnosti funguje tak, že zachytáva volania HTTP API pomocou a MockClientHttpRequestFactory. Na základe našej konfigurácie vytvorí zoznam očakávaných požiadaviek a zodpovedajúcich odpovedí. Keď RestTemplate inštancia zavolá API, vyhľadá požiadavku v zozname očakávaní a vráti príslušnú odpoveď.

Eliminuje teda potrebu spustenia servera HTTP v akomkoľvek inom porte na odosielanie falošných odpovedí.

Vytvorme jednoduchý test pre to isté getEmployee () príklad pomocou MockRestServiceServer:

@RunWith (SpringRunner.class) @ContextConfiguration (classes = SpringTestConfig.class) verejná trieda EmployeeServiceMockRestServiceServerUnitTest {@Autowired private EmployeeService empService; @Autowired private RestTemplate restTemplate; súkromný MockRestServiceServer mockServer; súkromný mapovač ObjectMapper = nový ObjectMapper (); @Before public void init () {mockServer = MockRestServiceServer.createServer (restTemplate); } @Test public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject () () {Employee emp = new Employee ("E001", "Eric Simmons"); mockServer.expect (ExpectedCount.once (), requestTo (nový URI ("// localhost: 8080 / employee / E001"))) .andExpect (metóda (HttpMethod.GET)) .andRespond (withStatus (HttpStatus.OK) .contentType (MediaType.APPLICATION_JSON) .body (mapper.writeValueAsString (emp))); Zamestnanec zamestnanec = empService.getEmployee (id); mockServer.verify (); Assert.assertEquals (emp, zamestnanec); }} 

V predchádzajúcom úryvku sme použili statické metódy z jazyka in MockRestRequestMatchers a MockRestResponseCreators definovať očakávanie a odpoveď na volanie REST jasným a čitateľným spôsobom:

importovať statický org.springframework.test.web.client.match.MockRestRequestMatchers. *; importovať statický org.springframework.test.web.client.response.MockRestResponseCreators. *;

Mali by sme mať na pamäti, že RestTemplate v testovacej triede by mala byť rovnaká inštancia použitá v EmployeeService trieda. Aby sme to zaistili, v konfigurácii pružiny sme definovali fazuľu RestTemplate a inštanciu sme zapojili automaticky v teste aj implementácii:

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

Pomocou a MockRestServiceServer je veľmi užitočné, keď píšeme naše integračné testy a stačí zosmiešňovať externé hovory HTTP.

4. Záver

V tomto stručnom článku sme diskutovali o niekoľkých účinných možnostiach zosmiešňovania externých volaní rozhrania REST API cez HTTP počas písania testov jednotiek.

Zdrojový kód pre vyššie uvedený článok je k dispozícii na GitHub.


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