A RestTemplate gúnyolása tavasszal

1. Bemutatkozás

Gyakran találunk olyan alkalmazásokat, amelyek valamilyen webes kérést teljesítenek. Ha ezt a viselkedést teszteljük, van néhány lehetőségünk a Spring alkalmazásokkal.

énEbben a gyors bemutatóban csak néhány módszert fogunk megvizsgálni, hogy csak a RestTemplate.

Elkezdjük a tesztelést a népszerű gúnyos könyvtárral, a Mockito-val. Ezután a Tavaszi tesztet fogjuk használni, amely mechanizmust biztosít egy álkiszolgáló létrehozására a szerver interakcióinak meghatározására.

2. Használata Mockito

Használhatnánk a Mockitót a csúfolásra RestTemplate teljesen. Ezzel a megközelítéssel szolgáltatásunk tesztelése ugyanolyan egyszerű lenne, mint bármely más gúnyolódással járó teszt.

Tegyük fel, hogy van egy egyszerű EmployeeService osztály, amely HTTP-n keresztül lehívja az alkalmazottak adatait:

@Service public class EmployeeService {@Autowired private RestTemplate restTemplate; public Employee getEmployee (String id) {ResponseEntity resp = restTemplate.getForEntity ("// localhost: 8080 / worker /" + id, Employee.class); return resp.getStatusCode () == HttpStatus.OK? ill.getBody (): null; }} 

Végezzük el az előző kód tesztjét:

@RunWith (MockitoJUnitRunner.class) nyilvános osztály EmployeeServiceTest {@Mock private RestTemplate restTemplate; @InjectMocks private EmployeeService empService = new EmployeeService (); @Test public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {Employee emp = new Employee ("E001", "Eric Simmons"); Mockito .when (restTemplate.getForEntity (“// localhost: 8080 / alkalmazott / E001”, Employee.class)) .thenReturn (új ResponseEntity (emp, HttpStatus.OK)); Alkalmazott alkalmazott = empService.getEmployee (id); Assert.assertEquals (emp, alkalmazott); }}

A fenti JUnit teszt osztályban először Mockitót kértük meg, hogy hozzon létre egy próbabábut RestTemplate példány használatával @Mock annotáció.

Aztán feljegyeztük a EmployeeService például a @InjectMocks hogy belefecskendezzék a dummy példányt.

Végül a vizsgálati módszerben meghatároztuk a gúnyunk viselkedését a Mockito segítségével, amikor / akkor támogatjuk.

3. A tavaszi teszt használata

AA Spring Test modul tartalmaz egy megnevezett szervert MockRestServiceServer.Ezzel a megközelítéssel konfiguráljuk a kiszolgálót egy adott objektum visszaküldésére, amikor egy konkrét kérést elküldünk a rendszerünkön keresztül RestTemplate példa. Végül megtehetjük igazolni () azon a szerverpéldányon, hogy minden elvárás teljesült-e vagy sem.

MockRestServiceServer valójában úgy működik, hogy elfogja a HTTP API hívásokat az a használatával MockClientHttpRequestFactory. Konfigurációnk alapján létrehozza a várható kérések és a megfelelő válaszok listáját. Amikor az RestTemplate példány felhívja az API-t, megkeresi a kérést az elvárások listájában, és visszaadja a megfelelő választ.

Így kiküszöböli a HTTP kiszolgáló futtatásának szükségességét bármely más porton az álválaszok küldéséhez.

Hozzunk létre egy egyszerű tesztet ugyanarról getEmployee () példa használatával MockRestServiceServer:

@RunWith (SpringRunner.class) @ContextConfiguration (class = SpringTestConfig.class) public class EmployeeServiceMockRestServiceServerUnitTest {@Autowired private EmployeeService empService; @Autowired private RestTemplate restTemplate; privát MockRestServiceServer mockServer; private ObjectMapper mapper = new ObjectMapper (); @A nyilvános void előtt init () {mockServer = MockRestServiceServer.createServer (restTemplate); } @Test public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject () () {Employee emp = new Employee ("E001", "Eric Simmons"); mockServer.expect (ExpectedCount.once (), requestTo (új URI ("// localhost: 8080 / alkalmazott / E001"))) .andExpect (metódus (HttpMethod.GET)) .andRespond (withStatus (HttpStatus.OK) .contentType (MediaType.APPLICATION_JSON) .body (mapper.writeValueAsString (emp))); Alkalmazott alkalmazott = empService.getEmployee (id); mockServer.verify (); Assert.assertEquals (emp, alkalmazott); }} 

Az előző részletben statikus módszereket használtunk MockRestRequestMatchers és MockRestResponseCreators a REST hívás elvárásának és válaszának világos és olvasható módon történő meghatározása:

statikus org.springframework.test.web.client.match.MockRestRequestMatchers importálása. *; statikus org.springframework.test.web.client.response.MockRestResponseCreators importálása. *;

Nem szabad megfeledkeznünk arról, hogy a RestTemplate a tesztosztályban meg kell egyeznie a EmployeeService osztály. Ennek biztosítása érdekében meghatároztunk egy RestTemplate babot a tavaszi konfigurációban, és automatikusan bekötöttük a példányt mind a tesztelés, mind a megvalósítás során:

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

Használva MockRestServiceServer nagyon hasznos, amikor az integrációs teszteket írjuk, és csak a külső HTTP hívásokat kell gúnyolnunk.

4. Következtetés

Ebben a rövid cikkben megvitattunk néhány hatékony lehetőséget a külső REST API-hívások HTTP-n keresztüli kigúnyolására az egységtesztek írása közben.

A fenti cikk forráskódja elérhető a GitHubon.


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