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.