Az első lépések a Mockito @Mock, @Spy, @Captor és @InjectMocks használatával

1. Áttekintés

Ebben az oktatóanyagban kitérünk a a Mockito könyvtár jegyzetei@Mock, @Kém, @Foglyul ejtő, és @InjectMocks.

További Mockito jóságért nézze meg az itt látható sorozatot.

2. Engedélyezze a Mockito kommentárokat

Mielőtt továbbmennénk, vizsgáljuk meg a Mockito-tesztek segítségével a kommentárok használatának engedélyezésének különböző módjait.

2.1. MockitoJUnitRunner

Az első lehetőségünk az, hogy jegyezze fel a JUnit tesztet a-val MockitoJUnitRunner mint a következő példában:

@RunWith (MockitoJUnitRunner.class) nyilvános osztály MockitoAnnotationTest {...}

2.2. MockitoAnnotations.initMocks ()

Alternatív megoldásként megtehetjük programozottan engedélyezze a Mockito kommentárokat valamint hivatkozással MockitoAnnotations.initMocks ():

@A nyilvános void előtt init () {MockitoAnnotations.initMocks (this); }

2.3. MockitoJUnit.rule ()

Végül, használhatjuk a MockitoJUnit.rule ()az alábbiak szerint:

public class MockitoInitWithMockitoJUnitRuleUnitTest {@Rule public MockitoRule initRule = MockitoJUnit.rule (); ...}

Ebben az esetben emlékeznünk kell a szabályunk megalkotására nyilvános.

3. @Mock Megjegyzés

A Mockito-ban a leggyakrabban használt annotáció a @Mock. Tudjuk használni @Mock gúnyos példányok létrehozása és injektálása hívás nélkül Mockito.mock manuálisan.

A következő példában - létrehozunk egy csúfoltat Tömb lista kézi módon, használat nélkül @Mock kommentár:

@Test public void whenNotUseMockAnnotation_thenCorrect () {List mockList = Mockito.mock (ArrayList.class); mockList.add ("egy"); Mockito.verify (mockList) .add ("egy"); assertEquals (0, mockList.size ()); Mockito.when (mockList.size ()). AkkorReturn (100); assertEquals (100, mockList.size ()); }

És most ugyanezt tesszük, de a gúttal a @Mock kommentár:

@Mock List mockedList; @Test public void whenUseMockAnnotation_thenMockIsInjected () {mockedList.add ("one"); Mockito.verify (mockedList) .add ("egy"); assertEquals (0, mockedList.size ()); Mockito.when (mockedList.size ()). AkkorReturn (100); assertEquals (100, mockedList.size ()); }

Vegye figyelembe, hogy - mindkét példában kölcsönhatásba lépünk a gúnnyal, és ellenőrizzük ezeknek a kölcsönhatásoknak a néhányat - csak azért, hogy megbizonyosodjunk arról, hogy a gúny helyesen viselkedik-e.

4. @Kém Megjegyzés

Most - nézzük meg, hogyan kell használni @Kém jegyzet egy meglévő példány kémleléséhez.

A következő példában - létrehozunk egy kém a Lista a régi módon használat nélkül @Kém kommentár:

@Test public void whenNotUseSpyAnnotation_thenCorrect () {List spyList = Mockito.spy (new ArrayList ()); spyList.add ("egy"); spyList.add ("kettő"); Mockito.verify (spyList) .add ("egy"); Mockito.verify (spyList) .add ("kettő"); assertEquals (2, spyList.size ()); Mockito.doReturn (100) .mikor (spyList) .size (); assertEquals (100, spyList.size ()); }

Most tegyük ugyanezt - kémkedjünk a listán -, de tegyük a @Kém kommentár:

@Spy List spiedList = new ArrayList (); @Test public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly () {spiedList.add ("one"); spiedList.add ("kettő"); Mockito.verify (spiedList) .add ("egy"); Mockito.verify (spiedList) .add ("kettő"); assertEquals (2, spiedList.size ()); Mockito.doReturn (100) .mikor (kémlista) .size (); assertEquals (100, spiedList.size ()); }

Figyelje meg, hogyan, mint korábban - itt is kapcsolatba lépünk a kémmel, hogy megbizonyosodjunk arról, hogy az megfelelően viselkedik-e. Ebben a példában:

  • Használt a igazi módszer spiedList.add () elemeket hozzáadni a spiedList.
  • Megszúrt a módszer, a metódus spiedList.size () visszatérni 100 ahelyett 2 felhasználásával Mockito.doReturn ().

5. @Foglyul ejtő Megjegyzés

Következő - nézzük meg, hogyan kell használni a @Foglyul ejtő annotáció egy ArgumentCaptor példa.

A következő példában - létrehozunk egy ArgumentCaptor a régi módon használat nélkül @Foglyul ejtő kommentár:

@Test public void whenNotUseCaptorAnnotation_thenCorrect () {List mockList = Mockito.mock (List.class); ArgumentCaptor arg = ArgumentCaptor.forClass (String.class); mockList.add ("egy"); Mockito.verify (mockList) .add (arg.capture ()); assertEquals ("egy", arg.getValue ()); }

Nézzük most kihasználni @Foglyul ejtőugyanezen célból - létrehozni egy ArgumentCaptor példa:

@Mock List mockedList; @Captor ArgumentCaptor argCaptor; @Test public void whenUseCaptorAnnotation_thenTheSam () {mockedList.add ("one"); Mockito.verify (mockedList) .add (argCaptor.capture ()); assertEquals ("egy", argCaptor.getValue ()); }

Figyelje meg, hogyan válik a teszt egyszerűbbé és olvashatóbbá, amikor kivesszük a konfigurációs logikát.

6. @InjectMocks Megjegyzés

Most - beszéljük meg, hogyan kell használni @InjectMocks annotáció - az álmezők automatikus injektálása a tesztelt objektumba.

A következő példában - használjuk @InjectMocks hogy beadja a gúnyt wordMap ba,-be MyDictionarydic:

@Mock Map wordMap; @InjectMocks MyDictionary dic = új MyDictionary (); @Test public void whenUseInjectMocksAnnotation_thenCorrect () {Mockito.when (wordMap.get ("aWord")).. assertEquals ("aMeaning", dic.getMeaning ("aWord")); }

És itt van az osztály MyDictionary:

nyilvános osztály MyDictionary {Map wordMap; nyilvános Saját szótár () {wordMap = new HashMap (); } public void add (végső karakterlánc-szó, végső karakterlánc-jelentés) {wordMap.put (szó, jelentés); } public String getMeaning (utolsó karakterlánc szó) {return wordMap.get (word); }} 

7. Gúny injektálása kémré

A fenti teszthez hasonlóan érdemes kigúnyot injektálnunk egy kémbe:

@Mock Map wordMap; @Spy Saját szótár spyDic = új Saját szótár ();

Mockito azonban nem támogatja a gúnyok injektálását a kémekbe, és a következő vizsgálati eredmények kivételével:

@Test public void whenUseInjectMocksAnnotation_thenCorrect () {Mockito.when (wordMap.get ("aWord")). ThenReturn ("aMeaning"); assertEquals ("aMeaning", spyDic.getMeaning ("aWord")); }

Ha egy kémet akarunk használni, akkor manuálisan beadhatjuk a modellt egy konstruktoron keresztül:

Saját szótár (Map wordMap) {this.wordMap = wordMap; }

A kommentár használata helyett most manuálisan létrehozhatjuk a kémet:

@Mock Map wordMap; MyDictionary spyDic; @A nyilvános void előtt init () {MockitoAnnotations.initMocks (this); spyDic = Mockito.spy (új MyDictionary (wordMap)); } 

A teszt most sikeres lesz.

8. Belefutás az NPE-be annotáció használata közben

Gyakran előfordulhat belefutni NullPointerException amikor megpróbáljuk ténylegesen használni a jelöléssel ellátott példányt @Mock vagy @Kém:

public class MockitoAnnotationsUninitializedUnitTest {@Mock List mockedList; @Test (várható = NullPointerException.class) public void whenMockitoAnnotationsUninialial_thenNPEThrown () {Mockito.when (mockedList.size ()). ThenReturn (1); }}

Legtöbbször ez egyszerűen azért történik, mert megfeledkeztünk a Mockito kommentárok megfelelő engedélyezéséről.

Tehát szem előtt kell tartanunk, hogy minden egyes alkalommal, amikor a Mockito megjegyzéseket akarjuk használni, meg kell tennünk egy további lépést és inicializálnunk kell őket, ahogy azt korábban már kifejtettük.

9. Megjegyzések

Végül - itt vannak néhány jegyzet a Mockito kommentárokról:

  • A Mockito kommentárjai minimalizálják az ismétlődő ál-létrehozási kódot
  • A teszteket olvashatóbbá teszik
  • @InjectMocks szükséges mindkettő injekciójához @Kém és @Mock példányok

10. Következtetés

Ebben a gyors bemutatóban bemutattuk a annotációk a Mockito könyvtárban.

Ezeknek a példáknak a megvalósítása megtalálható a GitHub-on. Ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.

És természetesen a további Mockito jóság érdekében nézze meg az itteni sorozatot.


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