Mockito.mock () vs @Mock vs @MockBean

1. Oversigt

I denne hurtige vejledning ser vi på tre forskellige måder at skabe mock-objekter på, og hvordan de adskiller sig fra hinanden - med Mockito og med Spring-mocking-support.

2. Mockito.mock ()

Det Mockito.mock () metode giver os mulighed for at oprette et mock-objekt i en klasse eller en grænseflade.

Derefter kan vi bruge mocken til at stoppe returværdier for dens metoder og kontrollere, om de blev kaldt.

Lad os se på et eksempel:

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

Denne metode har ikke brug for noget andet, før den kan bruges. Vi kan bruge det til at oprette mock-klassefelter såvel som lokale mocks i en metode.

3. Mockito's @Mock Kommentar

Denne kommentar er en stenografi for Mockito.mock () metode. Vi skal også kun bruge det i en testklasse. I modsætning til mock () metode, er vi nødt til at aktivere Mockito-kommentarer til at bruge denne kommentar.

Vi kan gøre dette enten ved hjælp af MockitoJUnitRunner at køre testen eller ringe til MockitoAnnotations.initMocks () metode eksplicit.

Lad os se på et eksempel ved hjælp af MockitoJUnitRunner:

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

Bortset fra at gøre koden mere læselig, @Mock gør det lettere at finde problemet mock i tilfælde af en fejl, da navnet på feltet vises i fejlmeddelelsen:

Ønsket men ikke påberåbt: mockRepository.count (); -> på org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) Faktisk var der nul interaktioner med denne mock. på org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) 

Også når det bruges sammen med @InjectMocks, kan det reducere mængden af ​​opsætningskode betydeligt.

4. Fjederstøvler @MockBean Kommentar

Vi kan bruge @MockBean for at tilføje mock-objekter til Spring-applikationskonteksten. Mock erstatter enhver eksisterende bønne af samme type i applikationens sammenhæng.

Hvis der ikke er defineret nogen bønne af samme type, tilføjes en ny. Denne kommentar er nyttig i integrationstest, hvor en bestemt bønne - for eksempel en ekstern tjeneste - skal spottes.

For at bruge denne kommentar skal vi bruge SpringRunner at køre testen:

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

Når vi bruger kommentaren på et felt såvel som at være registreret i applikationskonteksten, vil mocken også blive injiceret i marken.

Dette fremgår af koden ovenfor. Her har vi brugt den injicerede UserRepository mock at stubbe tælle metode. Vi har derefter brugt bønnen fra applikationskonteksten til at kontrollere, at det faktisk er den spottede bønne.

5. Konklusion

I denne artikel så vi, hvordan de tre metoder til oprettelse af mock-objekter adskiller sig, og hvordan hver kan bruges.

Kildekoden, der ledsager denne artikel, er tilgængelig på GitHub.