Mockito dan JUnit 5 - Menggunakan ExtendWith

1. Perkenalan

Di artikel singkat ini, kami akan menunjukkan cara mengintegrasikan Mockito dengan model ekstensi JUnit 5 . Untuk mempelajari lebih lanjut tentang model ekstensi JUnit 5, lihat artikel ini.

Pertama, kami akan menunjukkan cara membuat ekstensi yang secara otomatis membuat objek tiruan untuk atribut kelas atau parameter metode apa pun yang dianotasi dengan @Mock .

Kemudian, kami akan menggunakan ekstensi Mockito kami di kelas pengujian JUnit 5.

2. Ketergantungan Maven

2.1. Dependensi yang Diperlukan

Mari tambahkan dependensi JUnit 5 (jupiter) dan mockito ke pom.xml kita :

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

Perhatikan bahwa junit-jupiter-engine adalah pustaka JUnit 5 utama, dan junit-platform-launcher digunakan dengan plugin Maven dan peluncur IDE.

2.2. Plugin Pasti

Mari kita juga mengkonfigurasi plugin Maven Surefire untuk menjalankan kelas pengujian kita menggunakan peluncur platform JUnit baru:

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

2.3. Dependensi Kompatibilitas IDE JUnit 4

Agar kasus pengujian kami kompatibel dengan JUnit4 (vintage), untuk IDE yang belum memiliki dukungan untuk JUnit 5, mari sertakan dependensi ini:

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

Selain itu, kami harus mempertimbangkan untuk memberi anotasi pada semua kelas pengujian kami dengan @RunWith (JUnitPlatform.class)

Versi terbaru dari junit-jupiter-engine , junit-vintage-engine, junit-platform-launcher , dan mockito-core dapat diunduh dari Maven Central.

3. Ekstensi Mockito

Mockito menyediakan implementasi untuk ekstensi JUnit5 di perpustakaan - mockito-junit-jupiter . Kami akan menyertakan ketergantungan ini di pom.xml kami :

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Membangun Kelas Tes

Mari buat kelas uji kita dan lampirkan ekstensi Mockito padanya:

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

Kita dapat menggunakan anotasi @Mock untuk memasukkan tiruan untuk variabel instance yang dapat kita gunakan di mana saja di kelas pengujian:

@Mock UserRepository userRepository;

Selain itu, kami dapat memasukkan objek tiruan ke dalam parameter metode:

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

Harap perhatikan penggunaan Mockito.lenient () di sini. Mockito melontarkan UnsupportedStubbingException, saat tiruan yang diinisialisasi tidak dipanggil oleh salah satu metode pengujian selama eksekusi. Kita dapat menghindari pemeriksaan rintisan ketat ini dengan menggunakan metode ini saat menginisialisasi tiruan.

Kami bahkan dapat memasukkan objek tiruan ke dalam parameter metode pengujian:

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

Perhatikan bahwa tiruan MailClient yang kami masukkan sebagai parameter pengujian TIDAK akan menjadi instance yang sama dengan yang kami masukkan dalam metode init .

5. Kesimpulan

Junit 5 telah memberikan model yang bagus untuk ekstensi. Kami mendemonstrasikan ekstensi Mockito sederhana yang menyederhanakan logika pembuatan tiruan kami.

Semua kode yang digunakan dalam artikel ini dapat ditemukan di paket com.baeldung.junit5.mockito dari proyek GitHub, bersama dengan beberapa metode pengujian unit tambahan.