Mockito.mock () vs @Mock vs @MockBean

1. Oversikt

I denne raske opplæringen vil vi se på tre forskjellige måter å lage mock-objekter på og hvordan de skiller seg fra hverandre - med Mockito og med Spring mocking-støtte.

2. Mockito.mock ()

De Mockito.mock () metoden lar oss lage et hånlig objekt i en klasse eller et grensesnitt.

Deretter kan vi bruke mocken til å stoppe returverdier for metodene og verifisere om de ble kalt.

La oss se på et eksempel:

@Test offentlig ugyldig givenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned () {UserRepository localMockRepository = Mockito.mock (UserRepository.class); Mockito.when (localMockRepository.count ()). DeretterReturn (111L); lang userCount = localMockRepository.count (); Assert.assertEquals (111L, userCount); Mockito.verify (localMockRepository) .count (); }

Denne metoden trenger ikke noe annet å gjøres før den kan brukes. Vi kan bruke den til å lage mock-klasse felt så vel som lokale mocks i en metode.

3. Mockito's @Håne Kommentar

Denne kommentaren er en stenografi for Mockito.mock () metode. I tillegg bør vi bare bruke den i en testklasse. i motsetning til håne() metoden, må vi aktivere Mockito-merknader for å bruke denne merknaden.

Vi kan gjøre dette enten ved å bruke MockitoJUnitRunner å kjøre testen eller ringe MockitoAnnotations.initMocks () metoden eksplisitt.

La oss se på et eksempel ved hjelp av MockitoJUnitRunner:

@RunWith (MockitoJUnitRunner.class) offentlig klasse MockAnnotationUnitTest {@Mock UserRepository mockRepository; @Test offentlig ugyldig givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned () {Mockito.when (mockRepository.count ()). ThenReturn (123L); lang userCount = mockRepository.count (); Assert.assertEquals (123L, userCount); Mockito.verify (mockRepository) .count (); }}

Bortsett fra å gjøre koden mer lesbar, @Håne gjør det lettere å finne problemspottet i tilfelle en feil, ettersom navnet på feltet vises i feilmeldingen:

Ønsket men ikke påkalt: mockRepository.count (); -> på org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) Egentlig var det ingen interaksjoner med denne spotten. på org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) 

Også når det brukes sammen med @InjectMocks, kan det redusere mengden oppsettkode betydelig.

4. Vårstøvler @MockBean Kommentar

Vi kan bruke @MockBean for å legge til mock-objekter i vårapplikasjonskonteksten. Spottet erstatter alle eksisterende bønner av samme type i applikasjonssammenheng.

Hvis ingen bønner av samme type er definert, vil en ny bli lagt til. Denne merknaden er nyttig i integrasjonstester der en bestemt bønne - for eksempel en ekstern tjeneste - må spottes.

For å bruke denne merknaden, må vi bruke SpringRunner å kjøre testen:

@RunWith (SpringRunner.class) offentlig klasse MockBeanAnnotationIntegrationTest {@MockBean UserRepository mockRepository; @Autowired ApplicationContext-kontekst; @Test offentlig ugyldig givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned () {Mockito.when (mockRepository.count ()). ThenReturn (123L); UserRepository userRepoFromContext = context.getBean (UserRepository.class); long userCount = userRepoFromContext.count (); Assert.assertEquals (123L, userCount); Mockito.verify (mockRepository) .count (); }}

Når vi bruker merknaden på et felt, i tillegg til å være registrert i applikasjonssammenheng, vil mocken også injiseres i feltet.

Dette er tydelig i koden ovenfor. Her har vi brukt den injiserte UserRepository spotte å stubbe telle metode. Vi har da brukt bønnen fra applikasjonskonteksten for å bekrefte at den faktisk er den hånede bønnen.

5. Konklusjon

I denne artikkelen så vi hvordan de tre metodene for å lage mock-objekter er forskjellige og hvordan hver kan brukes.

Kildekoden som følger med denne artikkelen, er tilgjengelig på GitHub.


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