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.