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.