Mockito og JUnit 5 - Brug af ExtendWith

1. Introduktion

I denne hurtige artikel viser vi det hvordan man integrerer Mockito med JUnit 5-udvidelsesmodellen. For at lære mere om JUnit 5-udvidelsesmodellen, se denne artikel.

Først viser vi, hvordan man opretter en udvidelse, der automatisk opretter mock-objekter til enhver klasseattribut eller metodeparameter, der er kommenteret med @Mock.

Derefter bruger vi vores Mockito-udvidelse i en JUnit 5-testklasse.

2. Maven-afhængigheder

2.1. Nødvendige afhængigheder

Lad os tilføje JUnit 5 (jupiter) og mockito afhængigheder til vores 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 vigtigste JUnit 5-bibliotek, og junit-platform-launcher bruges med Maven plugin og IDE launcher.

2.2. Surefire-plugin

Lad os også konfigurere Maven Surefire-pluginet til at køre vores testklasser ved hjælp af den nye JUnit-platformstarter:

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

2.3. JUnit 4 IDE-kompatibilitetsafhængigheder

For at vores testcases skal være JUnit4 (vintage) kompatible, lad os medtage disse afhængigheder for IDE'er, der endnu ikke har nogen understøttelse af JUnit 5:

 org.junit.platform junit-platform-runner 1.2.0 test org.junit.vintag junit-vintage-motor 5.2.0 test 

Vi bør også overveje at kommentere alle vores testklasser med @RunWith (JUnitPlatform.class)

De nyeste versioner af junit-jupiter-motorjunit-vintage-motor, junit-platform-launcherog mockito-kerne kan downloades fra Maven Central.

3. Mockito-udvidelse

Mockito giver en implementering af JUnit5-udvidelser i biblioteket - mockito-junit-jupiter. Vi inkluderer denne afhængighed i vores pom.xml:

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Opbygning af testklassen

Lad os bygge vores testklasse og vedhæfte Mockito-udvidelsen til den:

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

Vi kan bruge @Mock kommentar til at injicere en mock til en instansvariabel, som vi kan bruge overalt i testklassen:

@Mock UserRepository userRepository;

Vi kan også injicere mock-objekter i metodeparametre:

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

Vær opmærksom på brugen af Mockito.lenient () her. Mockito kaster en Ikke-understøttetStubbingException, når en initialiseret mock ikke kaldes til af en af ​​testmetoderne under udførelse. Vi kan undgå denne strenge stubkontrol ved at bruge denne metode, når vi initialiserer mocks.

Vi kan endda injicere et mock-objekt i en testmetodeparameter:

@Test ugyldigt givenValidUser_whenSaveUser_thenSucceed (@Mock MailClient mailClient) {// Giv bruger = ny bruger ("Jerry", 12); når (userRepository.insert (enhver (User.class))). derefter (nyt svar () {int-sekvens = 1; @ Override offentlig brugersvar (InvocationOnMock-indkaldelse) kaster Throwable {User user = (User) invocation.getArgument (0 ); user.setId (sekvens ++); returbruger;}}); userService = ny DefaultUserService (userRepository, settingRepository, mailClient); // When User insertUser = userService.register (user); // Kontroller derefter (userRepository) .insert (bruger); Assertions.assertNotNull (user.getId ()); verificere (mailClient) .sendUserRegistrationMail (indsatUser); }

Bemærk, at MailClient mock at vi injicerer som en testparameter vil IKKE være den samme forekomst som vi injicerede i i det metode.

5. Konklusion

Junit 5 har leveret en god model til udvidelse. Vi demonstrerede en simpel Mockito-udvidelse, der forenklede vores mock-oprettelseslogik.

Al den kode, der bruges i denne artikel, kan findes i com.baeldung.junit5.mockito pakke med GitHub-projektet sammen med et par yderligere enhedstestmetoder.