Útmutató a ReflectionTestUtils egység teszteléséhez

1. Bemutatkozás

ReflectionTestUtils a Spring Test Context keretrendszer része. Ez egy gyűjtemény az egységben alkalmazott reflexióalapú segédprogram-módszerekhez és integrációs tesztelési forgatókönyvekhez a nem nyilvános mezők beállításához, a nem nyilvános módszerek meghívásához és a függőségek injektálásához.

Ebben az oktatóanyagban megvizsgáljuk, hogyan használhatjuk a ReflectionTestUtils az egység tesztelésében több példán keresztül.

2. Maven-függőségek

Kezdjük azzal, hogy hozzáadjuk a példáinkhoz szükséges összes függőség legújabb verzióit pom.xml:

 org.springframework tavaszi kontextus 5.1.2.RELEASE org.springframework rugós teszt 5.1.2.RELEASE teszt 

A legutolsó tavasz-összefüggés, tavasz-teszt függőségek letölthetők a Maven Central adattárból.

3. Használata ReflectionTestUtils nem nyilvános mező értékének beállításához

Tegyük fel, hogy egységtesztünk során egy olyan osztály egy példányát kell használnunk, amelynek privát mezője van, nyilvános beállító módszer nélkül.

Kezdjük a létrehozásával:

public class Alkalmazott {private Integer azonosító; privát karakterlánc neve; // szokásos getters / setters}

Normál esetben nem férünk hozzá a privát mezőhöz id értéket rendelni a teszteléshez, mert erre nincs nyilvános beállító módszer.

Ezután felhasználhatjuk ReflectionTestUtils.setField módszer a privát tag értékének hozzárendeléséhez id:

@Test public void whenNonPublicField_thenReflectionTestUtilsSetField () {Employee worker = new Employee (); ReflectionTestUtils.setField (alkalmazott, "id", 1); assertTrue (alkalmazott.getId (). egyenlő (1)); }

4. Használata ReflectionTestUtils nem nyilvános módszer meghívására

Képzeljük el, hogy van egy privát módszerünk workerToString ban ben Munkavállaló osztály:

private String workerToString () {return "id:" + getId () + "; név:" + getName (); }

Írhatunk egység tesztet a workerToString metódus az alábbiak szerint, annak ellenére, hogy nem rendelkezik hozzáféréssel egy Munkavállaló osztály:

@Test public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod () {Employee worker = new Employee (); ReflectionTestUtils.setField (alkalmazott, "id", 1); worker.setName ("Smith, John"); assertTrue (ReflectionTestUtils.invokeMethod (alkalmazott, "workerToString") .egyenlőség ("id: 1; név: Smith, John")); }

5. Használata ReflectionTestUtils a függőségek beadására

Tegyük fel, hogy meg akarnak írni egy egység tesztet a következő tavaszi komponenshez, amelynek privát mezője van a @Autowired kommentár:

@ Component public class EmployeeService {@Autowired private HRService hrService; public String findEmployeeStatus (Integer workerId) {return "Employee" + workerId + "status:" + hrService.getEmployeeStatus (workerId); }}

Most már megvalósíthatjuk a HRService alkatrész az alábbiak szerint:

@Component public class HRService {public String getEmployeeStatus (Integer workerId) {return "Inactive"; }}

Hozzon létre továbbá egy makett megvalósítást a HRService osztály a Mockito használatával. Fecskendezzük ezt az álcát a EmployeeService Például, és az egység tesztjénél felhasználjuk:

HRService hrService = gúny (HRService.class); mikor (hrService.getEmployeeStatus (worker.getId ())). thenReturn ("Aktív");

Mivel hrSzolgáltatás magánterület nyilvános szetter nélkül, használjuk ReflectionTestUtils.setField módszer a fentiekben létrehozott gúny beinjekciózására ebbe a privát mezőbe.

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

Végül az egység tesztünk hasonló lesz ehhez:

@Test public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField () {Munkavállalói alkalmazott = új Alkalmazott (); ReflectionTestUtils.setField (alkalmazott, "id", 1); worker.setName ("Smith, John"); HRService hrService = gúny (HRService.class); mikor (hrService.getEmployeeStatus (worker.getId ())). thenReturn ("Aktív"); EmployeeService workerService = új EmployeeService (); // Injektálja az álnevet a ReflectionTestUtils.setField privát mezőbe (workerService, "hrService", hrService); assertEquals ("Employee" + worker.getId () + "status: Active", workerService.findEmployeeStatus (worker.getId ())); }

Meg kell jegyeznünk, hogy ez a technika megkerüli azt a tényt, hogy a bab osztályban terepi injekciót alkalmazunk. Ha átállnánk a konstruktor befecskendezésére, akkor erre a megközelítésre nem lenne szükség.

6. Következtetés

Ebben az oktatóanyagban megmutattuk, hogyan kell használni ReflectionTestUtils az egység tesztelésében több példán keresztül.

A kódminták, mint mindig, a Githubon találhatók.


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