Mockito og JUnit 5 - Bruke ExtendWith

1. Introduksjon

I denne raske artikkelen skal vi vise hvordan du integrerer Mockito med utvidelsesmodellen JUnit 5. For å lære mer om JUnit 5-utvidelsesmodellen, se på denne artikkelen.

Først viser vi hvordan du oppretter en utvidelse som automatisk oppretter mock-objekter for ethvert klasseattributt eller metodeparameter merket med @Håne.

Deretter bruker vi Mockito-utvidelsen i en JUnit 5-testklasse.

2. Maven-avhengigheter

2.1. Nødvendige avhengigheter

La oss legge til JUnit 5 (jupiter) og mockito avhengigheter til vår pom.xml:

 org.junit.jupiter junit-jupiter-engine 5.3.1 test org.mockito mockito-core 2.21.0 test 

Noter det junit-jupiter-motor er det viktigste JUnit 5-biblioteket, og junit-platform-launcher brukes med Maven plugin og IDE launcher.

2.2. Surefire Plugin

La oss også konfigurere Maven Surefire-pluginet til å kjøre testklassene våre ved hjelp av den nye JUnit-plattformstarteren:

 maven-surefire-plugin 2.19.1 org.junit.platform junit-platform-surefire-provider 1.0.1 

2.3. JUnit 4 IDE Kompatibilitetsavhengigheter

For at testtilfellene våre skal være JUnit4 (vintage) kompatible, for IDEer som ikke har støtte for JUnit 5 ennå, la oss inkludere disse avhengighetene:

 org.junit.platform junit-platform-runner 1.2.0 test org.junit.vintage junit-vintage-engine 5.2.0 test 

Vi bør også vurdere å kommentere alle testklassene våre med @RunWith (JUnitPlatform.class)

De siste versjonene av junit-jupiter-motorjunit-vintage-motor, junit-platform-launcher, og mockito-kjerne kan lastes ned fra Maven Central.

3. Mockito Extension

Mockito gir en implementering for JUnit5-utvidelser i biblioteket - mockito-junit-jupiter. Vi vil inkludere denne avhengigheten i vår pom.xml:

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Bygging av testklassen

La oss bygge testklassen vår og feste Mockito-utvidelsen til den:

@ExtendWith (MockitoExtension.class) @RunWith (JUnitPlatform.class) offentlig klasse UserServiceUnitTest {UserService userService; ... //}

Vi kan bruke @Håne kommentar for å injisere en mock for en forekomstvariabel som vi kan bruke hvor som helst i testklassen:

@Mock UserRepository userRepository;

Vi kan også injisere mock-objekter i metodeparametere:

@BeforeEach void init (@Mock SettingRepository settingRepository) {userService = new DefaultUserService (userRepository, settingRepository, mailClient); Mockito.lenient (). Når (settingRepository.getUserMinAge ()). ThenReturn (10); når (settingRepository.getUserNameMinLength ()). deretterReturn (4); Mockito.lenient () .when (userRepository.isUsernameAlreadyExists (any (String.class))) .thenReturn (false); }

Vær oppmerksom på bruken av Mockito.lenient () her. Mockito kaster en Ikke-støttetStubbingException, når en initialisert mock ikke blir ringt opp av en av testmetodene under utførelsen. Vi kan unngå denne strenge stubkkontrollen ved å bruke denne metoden når vi initialiserer mocks.

Vi kan til og med injisere et mock-objekt i en testmetodeparameter:

@Test ugyldig gittValidUser_whenSaveUser_thenSucceed (@Mock MailClient mailClient) {// Gitt bruker = ny bruker ("Jerry", 12); når (userRepository.insert (hvilken som helst (User.class))). deretter (nytt svar () {int-sekvens = 1; @ Override offentlig brukersvar (InvocationOnMock-anrop) kaster Throwable {User user = (User) invocation.getArgument (0 ); user.setId (sekvens ++); retur bruker;}}); userService = ny DefaultUserService (userRepository, settingRepository, mailClient); // Når bruker innsatt bruker = brukerService.register (bruker); // Kontroller deretter (userRepository) .insert (user); Assertions.assertNotNull (user.getId ()); verifisere (mailClient) .sendUserRegistrationMail (InsertUser); }

Merk at MailClient mock at vi injiserer som en testparameter vil IKKE være den samme forekomsten som vi injiserte i i det metode.

5. Konklusjon

Junit 5 har gitt en fin modell for utvidelse. Vi demonstrerte en enkel Mockito-utvidelse som forenklet logikken vår om å lage mock.

All koden som brukes i denne artikkelen finner du i com.baeldung.junit5.mockito pakke med GitHub-prosjektet, sammen med noen få tilleggstestmetoder.


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