Mockito und JUnit 5 - Verwenden von ExtendWith

1. Einleitung

In diesem kurzen Artikel zeigen wir, wie Mockito in das JUnit 5-Erweiterungsmodell integriert wird . Weitere Informationen zum JUnit 5-Erweiterungsmodell finden Sie in diesem Artikel.

Zunächst wird gezeigt, wie eine Erweiterung erstellt wird, die automatisch Scheinobjekte für jedes mit @Mock kommentierte Klassenattribut oder Methodenparameter erstellt .

Dann verwenden wir unsere Mockito-Erweiterung in einer JUnit 5-Testklasse.

2. Maven-Abhängigkeiten

2.1. Erforderliche Abhängigkeiten

Fügen wir die Abhängigkeiten JUnit 5 (Jupiter) und Mockito zu unserer pom.xml hinzu :

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

Beachten Sie, dass die Junit-Jupiter-Engine die Hauptbibliothek von JUnit 5 ist und der Junit-Plattform-Launcher mit dem Maven-Plugin und dem IDE-Launcher verwendet wird.

2.2. Surefire Plugin

Lassen Sie uns auch das Maven Surefire-Plugin so konfigurieren, dass unsere Testklassen mit dem neuen JUnit-Plattform-Launcher ausgeführt werden:

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

2.3. JUnit 4 IDE-Kompatibilitätsabhängigkeiten

Damit unsere Testfälle JUnit4 (Vintage) -kompatibel sind und IDEs, die JUnit 5 noch nicht unterstützen, die folgenden Abhängigkeiten enthalten:

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

Außerdem sollten wir erwägen, alle unsere Testklassen mit @RunWith (JUnitPlatform.class) zu kommentieren.

Die neuesten Versionen von Junit-Jupiter-Engine , Junit-Vintage-Engine, Junit-Plattform-Launcher und Mockito-Core können von Maven Central heruntergeladen werden.

3. Mockito-Erweiterung

Mockito bietet eine Implementierung für JUnit5-Erweiterungen in der Bibliothek - mockito-junit-jupiter . Wir werden diese Abhängigkeit in unsere pom.xml aufnehmen:

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Erstellen der Testklasse

Lassen Sie uns unsere Testklasse erstellen und die Mockito-Erweiterung daran anhängen:

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

Wir können die Annotation @Mock verwenden , um ein Modell für eine Instanzvariable einzufügen , die wir an einer beliebigen Stelle in der Testklasse verwenden können:

@Mock UserRepository userRepository;

Wir können auch Scheinobjekte in Methodenparameter einfügen:

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

Bitte beachten Sie die Verwendung von Mockito.lenient () hier. Mockito löst eine UnsupportedStubbingException aus, wenn ein initialisierter Mock während der Ausführung nicht von einer der Testmethoden aufgerufen wird. Wir können diese strenge Stub-Überprüfung vermeiden, indem wir diese Methode beim Initialisieren der Mocks verwenden.

Wir können sogar ein Scheinobjekt in einen Testmethodenparameter einfügen:

@Test void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) { // Given user = new User("Jerry", 12); when(userRepository.insert(any(User.class))).then(new Answer() { int sequence = 1; @Override public User answer(InvocationOnMock invocation) throws Throwable { User user = (User) invocation.getArgument(0); user.setId(sequence++); return user; } }); userService = new DefaultUserService(userRepository, settingRepository, mailClient); // When User insertedUser = userService.register(user); // Then verify(userRepository).insert(user); Assertions.assertNotNull(user.getId()); verify(mailClient).sendUserRegistrationMail(insertedUser); }

Beachten Sie, dass der MailClient- Mock, den wir als Testparameter einfügen , NICHT dieselbe Instanz ist, die wir in die init- Methode eingefügt haben .

5. Schlussfolgerung

Junit 5 hat ein schönes Modell für die Erweiterung bereitgestellt. Wir haben eine einfache Mockito-Erweiterung demonstriert, die unsere Mock-Erstellungslogik vereinfacht.

Der gesamte in diesem Artikel verwendete Code befindet sich im Paket com.baeldung.junit5.mockito des GitHub-Projekts, zusammen mit einigen zusätzlichen Unit-Test-Methoden.