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.