Vodič za ReflectionTestUtils za jedinstveno testiranje

1. Uvod

ReflectionTestUtils je dio okvira za proljetni testni kontekst. To je zbirka za korisne metode temeljene na refleksiji korištene u jedinici i scenarije integracijskog testiranja za postavljanje nejavnih polja, pozivanje nejavnih metoda i ubrizgavanje ovisnosti.

U ovom uputstvu ćemo pogledati kako možemo koristiti ReflectionTestUtils u jedinstvenom testiranju kroz nekoliko primjera.

2. Ovisnosti Mavena

Počnimo s dodavanjem najnovijih verzija svih potrebnih ovisnosti potrebnih za naše primjere pom.xml:

 org.springframework spring-context 5.1.2.RELEASE org.springframework spring-test 5.1.2.Opusti test 

Najnoviji opruga-kontekst, opruga-test ovisnosti se mogu preuzeti iz spremišta Maven Central.

3. Korištenje ReflectionTestUtils za postavljanje vrijednosti nejavnog polja

Pretpostavimo da u našem jediničnom testu moramo koristiti instancu klase koja ima privatno polje bez metode javnog postavljača.

Počnimo s izradom:

zaposlenik u javnoj klasi {private Integer id; privatni naziv niza; // standardni getteri / postavljači}

Obično ne možemo pristupiti privatnom polju iskaznica dodijeliti vrijednost za testiranje, jer za nju ne postoji metoda javnog postavljača.

Tada možemo koristiti ReflectionTestUtils.setField metoda za dodjeljivanje vrijednosti privatnom članu iskaznica:

@Test public void whenNonPublicField_thenReflectionTestUtilsSetField () {zaposlenik zaposlenik = novi zaposlenik (); ReflectionTestUtils.setField (zaposlenik, "id", 1); assertTrue (worker.getId (). jednako (1)); }

4. Korištenje ReflectionTestUtils pozivati ​​se na nejavnu metodu

Zamislimo sada da imamo privatnu metodu workerToString u Zaposlenik razred:

private String workerToString () {return "id:" + getId () + "; name:" + getName (); }

Možemo napisati jedinični test za workerToString metoda kao u nastavku, iako nema pristup izvan Zaposlenik razred:

@Test public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod () {zaposlenik zaposlenik = novi zaposlenik (); ReflectionTestUtils.setField (zaposlenik, "id", 1); worker.setName ("Smith, John"); assertTrue (ReflectionTestUtils.invokeMethod (zaposlenik, "workerToString") .equals ("id: 1; ime: Smith, John")); }

5. Korištenje ReflectionTestUtils ubrizgati ovisnosti

Recimo da želimo napisati jedinični test za sljedeću komponentu Spring koja ima privatno polje s @Autowired napomena:

@Component javna klasa EmployeeService {@Autowired private HRService hrService; javni String findEfficieeStatus (Integer workerId) {return "Employee" + workerId + "status:" + hrService.getEfficieeStatus (workerId); }}

Sada možemo implementirati HRService komponenta kao dolje:

@Component javna klasa HRService {public String getEfficieeStatus (Integer workerId) {return "Neaktivan"; }}

Nadalje, kreirajmo lažnu implementaciju za HRService klase pomoću Mockita. Ubacit ćemo ovaj lažni podatak u Usluga zaposlenika i koristit ćemo ga u našem jediničnom testu:

HRService hrService = lažno (HRService.class); kada (hrService.getEfficieeStatus (worker.getId ())). thenReturn ("Active");

Jer hrUsluga je privatno polje bez javnog postavljača, koristit ćemo ReflectionTestUtils.setField metoda za ubrizgavanje lažne slike koju smo gore stvorili u ovo privatno polje.

EmployeeService workerService = nova EmployeeService (); ReflectionTestUtils.setField (workerService, "hrService", hrService);

Konačno, naš će jedinstveni test izgledati slično ovome:

@Test public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField () {zaposlenik zaposlenik = novi zaposlenik (); ReflectionTestUtils.setField (zaposlenik, "id", 1); worker.setName ("Smith, John"); HRService hrService = lažno (HRService.class); kada (hrService.getEfficieeStatus (worker.getId ())). thenReturn ("Active"); EmployeeService workerService = nova EmployeeService (); // ubrizgavanje lažnog u privatno polje ReflectionTestUtils.setField (workerService, "hrService", hrService); assertEquals ("Employee" + worker.getId () + "status: Active", workerService.findEfficieeStatus (worker.getId ())); }

Trebali bismo napomenuti da je ova tehnika zaobilazno za činjenicu da koristimo ubrizgavanje polja u našoj klasi graha. Ako bismo prešli na ubrizgavanje konstruktora, ovaj pristup ne bi bio potreban.

6. Zaključak

U ovom uputstvu pokazali smo kako se koristi ReflectionTestUtils u jedinstvenom testiranju kroz nekoliko primjera.

Uzorke koda, kao i uvijek, možete pronaći na Githubu.


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