Mockito e JUnit 5 - Utilizzo di ExtendWith

1. Introduzione

In questo rapido articolo, mostreremo come integrare Mockito con il modello di estensione JUnit 5 . Per saperne di più sul modello di estensione JUnit 5, dai un'occhiata a questo articolo.

Innanzitutto, mostreremo come creare un'estensione che crei automaticamente oggetti fittizi per qualsiasi attributo di classe o parametro di metodo annotato con @Mock .

Quindi, useremo la nostra estensione Mockito in una classe di test JUnit 5.

2. Dipendenze di Maven

2.1. Dipendenze richieste

Aggiungiamo le dipendenze JUnit 5 (jupiter) e mockito al nostro pom.xml :

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

Nota che junit-jupiter-engine è la libreria principale di JUnit 5 e junit-platform-launcher viene utilizzato con il plug-in Maven e il launcher IDE.

2.2. Plugin Surefire

Configuriamo anche il plug-in Maven Surefire per eseguire le nostre classi di test utilizzando il nuovo launcher della piattaforma JUnit:

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

2.3. Dipendenze di compatibilità IDE JUnit 4

Affinché i nostri casi di test siano compatibili con JUnit4 (vintage), per IDE che non hanno ancora il supporto per JUnit 5, includiamo queste dipendenze:

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

Inoltre, dovremmo considerare di annotare tutte le nostre classi di test con @RunWith (JUnitPlatform.class)

Le ultime versioni di junit-jupiter-engine , junit-vintage-engine, junit-platform-launcher e mockito-core possono essere scaricate da Maven Central.

3. Estensione Mockito

Mockito fornisce un'implementazione per le estensioni JUnit5 nella libreria: mockito-junit-jupiter . Includeremo questa dipendenza nel nostro pom.xml:

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Creazione della classe di test

Creiamo la nostra classe di test e alleghiamo l'estensione Mockito:

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

Possiamo usare l' annotazione @Mock per iniettare un mock per una variabile di istanza che possiamo usare ovunque nella classe di test:

@Mock UserRepository userRepository;

Inoltre, possiamo iniettare oggetti fittizi nei parametri del metodo:

@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); }

Si prega di notare l'uso di Mockito.lenient () qui. Mockito genera un'eccezione UnsupportedStubbingException, quando un mock inizializzato non viene chiamato da uno dei metodi di test durante l'esecuzione. Possiamo evitare questo rigoroso controllo degli stub utilizzando questo metodo durante l'inizializzazione dei mock.

Possiamo persino iniettare un oggetto fittizio in un parametro del metodo di test:

@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); }

Nota che il mock MailClient che iniettiamo come parametro di test NON sarà la stessa istanza che abbiamo iniettato nel metodo init .

5. conclusione

Junit 5 ha fornito un bel modello per l'estensione. Abbiamo dimostrato una semplice estensione Mockito che ha semplificato la nostra logica di creazione fittizia.

Tutto il codice utilizzato in questo articolo può essere trovato nel pacchetto com.baeldung.junit5.mockito del progetto GitHub, insieme ad alcuni metodi di unit test aggiuntivi.