Početak rada s Mockito @Mock, @Spy, @Captor i @InjectMocks

1. Pregled

U ovom ćemo uputstvu pokriti napomene knjižnice Mockito@Oponašanje, @Špijun, @Captor, i @InjectMocks.

Za više Mockito dobrote, pogledajte seriju ovdje.

2. Omogućite Mockito bilješke

Prije nego što krenemo dalje, istražimo različite načine kako omogućiti upotrebu napomena uz Mockito testove.

2.1. MockitoJUnitRunner

Prva opcija koju imamo je da označite JUnit test s MockitoJUnitRunner kao u sljedećem primjeru:

@RunWith (MockitoJUnitRunner.class) javna klasa MockitoAnnotationTest {...}

2.2. MockitoAnnotations.initMocks ()

Alternativno, možemo programski omogućiti Mockito bilješke kao i pozivanjem MockitoAnnotations.initMocks ():

@Prije javne void init () {MockitoAnnotations.initMocks (ovo); }

2.3. MockitoJUnit.rule ()

Posljednje, možemo koristiti a MockitoJUnit.rule ()kako je prikazano dolje:

javna klasa MockitoInitWithMockitoJUnitRuleUnitTest {@Rule javna MockitoRule initRule = MockitoJUnit.rule (); ...}

U ovom slučaju, moramo se sjetiti da postavimo svoje pravilo javnost.

3. @Oponašanje Bilješka

Najčešće korištena napomena u Mockitu je @Oponašanje. Možemo koristiti @Oponašanje za stvaranje i ubrizgavanje ismijanih primjeraka bez potrebe za pozivanjem Mockito.mock ručno.

U sljedećem primjeru - stvorit ćemo ismijani ArrayList ručnim načinom bez upotrebe @Oponašanje napomena:

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

I sada ćemo učiniti isto, ali ubrizgat ćemo lažni obrazac pomoću @Oponašanje napomena:

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

Imajte na umu kako - u oba primjera komuniciramo s lažnim porukama i provjeravamo neke od tih interakcija - samo kako bismo bili sigurni da se lažni modeli pravilno ponašaju.

4. @Špijun Bilješka

Sada - da vidimo kako koristiti @Špijun napomena za špijuniranje postojeće instance.

U sljedećem primjeru - stvaramo špijuna a Popis na stari način bez upotrebe @Špijun napomena:

@Test public void whenNotUseSpyAnnotation_thenCorrect () {List spyList = Mockito.spy (new ArrayList ()); spyList.add ("jedan"); spyList.add ("dva"); Mockito.verify (spyList) .add ("jedan"); Mockito.verify (spyList) .add ("dva"); assertEquals (2, spyList.size ()); Mockito.doReturn (100) .when (spyList) .size (); assertEquals (100, spyList.size ()); }

Učinimo sada isto - špijunirajte popis - ali učinite to pomoću @Špijun napomena:

@ Špijunski popis spiedList = novi ArrayList (); @Test javna void whenUseSpyAnnotation_thenSpyIsInjectedCorrect () {spiedList.add ("one"); spiedList.add ("dva"); Mockito.verify (spiedList) .add ("jedan"); Mockito.verify (spiedList) .add ("dva"); assertEquals (2, spiedList.size ()); Mockito.doReturn (100) .when (spiedList) .size (); assertEquals (100, spiedList.size ()); }

Primijetite kako, kao i prije - komuniciramo sa špijunom ovdje kako bismo bili sigurni da se ponaša ispravno. U ovom primjeru mi:

  • Koristio stvaran metoda spiedList.add () za dodavanje elemenata u spiedList.
  • Stubsed metoda spiedList.size () vratiti 100 umjesto 2 koristeći Mockito.doReturn ().

5. @Captor Bilješka

Dalje - da vidimo kako koristiti @Captor napomena za stvaranje ArgumentCaptor primjer.

U sljedećem primjeru - kreiramo ArgumentCaptor na stari način bez upotrebe @Captor napomena:

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

Idemo sada iskoristiti @Captoru istu svrhu - stvoriti ArgumentCaptor primjer:

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

Primijetite kako test postaje jednostavniji i čitljiviji kad izvadimo konfiguracijsku logiku.

6. @InjectMocks Bilješka

Sada - razgovarajmo o tome kako koristiti @InjectMocks napomena - za automatsko ubrizgavanje lažnih polja u testirani objekt.

U sljedećem primjeru - koristimo @InjectMocks ubrizgati mock karta riječi u MyDictionarydic:

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

I ovdje je razred MyDictionary:

javna klasa MyDictionary {Map wordMap; javni MyDictionary () {wordMap = novi HashMap (); } public void add (zadnja riječ stringa, konačno značenje značenja) {wordMap.put (riječ, značenje); } javni String getMeaning (završna riječ stringa) {return wordMap.get (riječ); }} 

7. Ubrizgavanje izrugivanja u špijuna

Slično gore navedenom testu, možda bismo htjeli ubrizgati lažnu riječ u špijuna:

@Mock Map wordMap; @Spy MyDictionary spyDic = novi MyDictionary ();

Međutim, Mockito ne podržava ubrizgavanje rugalica u špijune, i sljedeći rezultati ispitivanja u iznimci:

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

Ako želimo koristiti lažnu špijunku, ručnu injekciju možemo ubrizgati kroz konstruktor:

MyDictionary (Map wordMap) {this.wordMap = wordMap; }

Umjesto korištenja napomene, špijuna sada možemo stvoriti ručno:

@Mock Map wordMap; MyDictionary spyDic; @Prije javne void init () {MockitoAnnotations.initMocks (ovo); spyDic = Mockito.spy (novi MyDictionary (wordMap)); } 

Test će sada proći.

8. Nalet na NPE tijekom korištenja bilješki

Često možemo naletjeti NullPointerException kada pokušamo zapravo upotrijebiti primjerak označen s @Oponašanje ili @Špijun:

javna klasa MockitoAnnotationsUninitializedUnitTest {@Mock List mockedList; @Test (očekuje se = NullPointerException.class) javna praznina kadaMockitoAnnotationsUninitialized_thenNPEThrown () {Mockito.when (mockedList.size ()). ThenReturn (1); }}

To se najčešće događa jednostavno zato što smo zaboravili pravilno omogućiti Mockito bilješke.

Dakle, moramo imati na umu da svaki put kada želimo koristiti Mockito bilješke, moramo poduzeti dodatni korak i inicijalizirati ih kao što smo već objasnili.

9. Bilješke

Napokon - evo neke bilješke o Mockito bilješkama:

  • Mockitove bilješke minimiziraju ponavljajuće lažne kodove stvaranja
  • Testove čine čitljivijima
  • @InjectMocks je potrebno za ubrizgavanje oba @Špijun i @Oponašanje instance

10. Zaključak

U ovom smo brzom vodiču pokazali osnove napomene u knjižnici Mockito.

Implementacija svih ovih primjera može se naći na GitHubu. Ovo je Maven projekt, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.

I naravno, za više Mockito dobrote, pogledajte seriju ovdje.