Mockito dan JUnit 5 - Menggunakan ExtendWith

1. Pengenalan

Dalam artikel ringkas ini, kami akan menunjukkan cara mengintegrasikan Mockito dengan model sambungan JUnit 5 . Untuk mengetahui lebih lanjut mengenai model pelanjutan JUnit 5, lihat artikel ini.

Pertama, kami akan menunjukkan cara membuat peluasan yang secara automatik membuat objek tiruan untuk atribut kelas atau parameter kaedah yang dijelaskan dengan @Mock .

Kemudian, kami akan menggunakan pelanjutan Mockito kami di kelas ujian JUnit 5.

2. Pergantungan Maven

2.1. Tanggungan yang diperlukan

Mari tambahkan kebergantungan JUnit 5 (jupiter) dan mockito ke pom.xml kami :

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

Perhatikan bahawa mesin junit-jupiter adalah perpustakaan JUnit 5 utama, dan peluncur platform junit digunakan dengan pemalam Maven dan pelancar IDE.

2.2. Plugin Surefire

Mari juga konfigurasikan plugin Maven Surefire untuk menjalankan kelas ujian kami menggunakan pelancar platform JUnit yang baru:

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

2.3. Ketergantungan Keserasian JUnit 4 IDE

Untuk kes ujian kami agar serasi dengan JUnit4 (vintaj), untuk IDE yang belum mempunyai sokongan untuk JUnit 5, mari sertakan kebergantungan berikut:

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

Juga, kita harus mempertimbangkan untuk memberi penjelasan kepada semua kelas ujian kami dengan @RunWith (JUnitPlatform.class)

Versi terbaru mesin junit-jupiter , mesin junit-vintaj, peluncur platform- junit , dan mockito-core boleh dimuat turun dari Maven Central.

3. Sambungan Mockito

Mockito menyediakan pelaksanaan untuk sambungan JUnit5 di perpustakaan - mockito-junit-jupiter . Kami akan memasukkan kebergantungan ini dalam pom.xml kami :

 org.mockito mockito-junit-jupiter 2.23.0 test 

4. Membina Kelas Ujian

Mari membina kelas ujian kami dan lampirkan pelanjutan Mockito padanya:

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

Kita boleh menggunakan anotasi @Mock untuk memasukkan tiruan untuk pemboleh ubah contoh yang boleh kita gunakan di mana sahaja di kelas ujian:

@Mock UserRepository userRepository;

Kita juga boleh memasukkan objek tiruan ke dalam parameter kaedah:

@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 maklum penggunaan Mockito.lenient () di sini. Mockito melemparkan UnsupportedStubbingException, apabila mock awal tidak dipanggil oleh salah satu kaedah ujian semasa pelaksanaan. Kita boleh mengelakkan pemeriksaan rintisan yang ketat ini dengan menggunakan kaedah ini ketika memulakan ejekan.

Kita bahkan boleh memasukkan objek tiruan ke parameter kaedah ujian:

@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 bahawa tiruan MailClient yang kami suntikan sebagai parameter ujian TIDAK akan menjadi contoh yang sama seperti yang kami suntikan dalam kaedah init .

5. Kesimpulan

Junit 5 telah memberikan model yang baik untuk pengembangan. Kami menunjukkan peluasan Mockito ringkas yang mempermudah logik pembuatan tiruan kami.

Semua kod yang digunakan dalam artikel ini boleh didapati di pakej com.baeldung.junit5.mockito projek GitHub, bersama dengan beberapa kaedah ujian unit tambahan.