Sprievodca po ReflectionTestUtils pre testovanie jednotiek

1. Úvod

ReflectionTestUtils je súčasťou rámcového kontextu jarných testov. Je to zbierka metód reflexie založených na užitých jednotkách a scenárov testovania integrácie na nastavenie neverejných polí, vyvolanie neverejných metód a vloženie závislostí.

V tomto výučbe sa pozrieme na to, ako môžeme používať ReflectionTestUtils pri testovaní jednotiek prostredníctvom niekoľkých príkladov.

2. Maven závislosti

Začnime tým, že do našej pridáme najnovšie verzie všetkých potrebných závislostí potrebných pre naše príklady pom.xml:

 org.springframework jarný kontext 5.1.2.RELEASE org.springframework jarný test 5.1.2.RELEASE test 

Posledný jarný kontext, jarný test závislosti je možné stiahnuť z centrálneho úložiska Maven.

3. Používanie ReflectionTestUtils na nastavenie hodnoty neverejného poľa

Predpokladajme, že v našom teste jednotiek musíme použiť inštanciu triedy, ktorá má súkromné ​​pole bez metódy verejného nastavenia.

Začnime jeho vytvorením:

public class Employee {private Integer id; súkromné ​​meno reťazca; // štandardné getre / settery}

Za normálnych okolností nemáme prístup do súkromného poľa id priradiť hodnotu na testovanie, pretože pre ňu neexistuje verejná metóda nastavenia.

Potom môžeme použiť ReflectionTestUtils.setField metóda na priradenie hodnoty súkromnému členovi id:

@Test public void whenNonPublicField_thenReflectionTestUtilsSetField () {zamestnanec zamestnanec = nový zamestnanec (); ReflectionTestUtils.setField (zamestnanec, "id", 1); assertTrue (employee.getId (). equals (1)); }

4. Používanie ReflectionTestUtils vyvolať neverejnú metódu

Poďme si teraz predstaviť, že máme súkromnú metódu employeeToString v Zamestnanec trieda:

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

Môžeme napísať jednotkový test pre employeeToString metóda uvedená nižšie, aj keď nemá prístup zvonku Zamestnanec trieda:

@Test public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod () {zamestnanec zamestnanec = nový zamestnanec (); ReflectionTestUtils.setField (zamestnanec, "id", 1); employee.setName ("Smith, John"); assertTrue (ReflectionTestUtils.invokeMethod (zamestnanec, "employeeToString") .equals ("id: 1; meno: Smith, John")); }

5. Používanie ReflectionTestUtils na injekciu závislostí

Povedzme, že chcete napísať test jednotky pre nasledujúcu komponentu Spring, ktorá má súkromné ​​pole s @Autowired anotácia:

@ Komponenta verejná trieda EmployeeService {@Autowired private HRService hrService; public String findEmployeeStatus (Integer employeeId) {návrat "Employee" + employeeId + "stav:" + hrService.getEmployeeStatus (employeeId); }}

Teraz môžeme implementovať HRService ako je uvedené nižšie:

@ Komponenta verejná trieda HRService {verejný reťazec getEmployeeStatus (Integer employeeId) {návrat "Neaktívny"; }}

Ďalej vytvorme falošnú implementáciu pre HRService triedy pomocou Mockita. Túto falošnú látku vpichneme do EmployeeService napríklad a použijeme to v našom teste jednotky:

HRService hrService = falošná (HRService.class); when (hrService.getEmployeeStatus (employee.getId ())). thenReturn ("Aktívny");

Pretože hrSlužba je súkromné ​​pole bez verejného nastavovača, použijeme ReflectionTestUtils.setField metóda na vloženie falošného obsahu, ktorý sme vytvorili vyššie, do tohto súkromného poľa.

EmployeeService employeeService = nový EmployeeService (); ReflectionTestUtils.setField (employeeService, "hrService", hrService);

Nakoniec bude náš jednotkový test vyzerať podobne ako tento:

@Test public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField () {Employee employee = new Employee (); ReflectionTestUtils.setField (zamestnanec, "id", 1); employee.setName ("Smith, John"); HRService hrService = falošná (HRService.class); when (hrService.getEmployeeStatus (employee.getId ())). thenReturn ("Aktívny"); EmployeeService employeeService = nový EmployeeService (); // Vstreknite faloš do súkromného poľa ReflectionTestUtils.setField (employeeService, "hrService", hrService); assertEquals ("Zamestnanec" + employee.getId () + "stav: Aktívny", employeeService.findEmployeeStatus (employee.getId ())); }

Mali by sme poznamenať, že táto technika je riešením toho, že v triede fazule používame injekciu poľa. Keby sme prešli na injektor konštruktora, potom by tento prístup nebol potrebný.

6. Záver

V tomto tutoriáli sme si ukázali, ako sa používa ReflectionTestUtils pri testovaní jednotiek prostredníctvom niekoľkých príkladov.

Ukážky kódu, ako vždy, nájdete na Githube.


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