Mockito.mock () vs @MockBean vs @MockBean

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat tiga cara berbeda untuk membuat objek tiruan dan bagaimana mereka berbeda satu sama lain - dengan Mockito dan dengan dukungan mengejek Musim Semi.

2. Mockito.mock ()

Metode Mockito.mock () memungkinkan kita membuat objek tiruan dari suatu kelas atau antarmuka.

Kemudian, kita dapat menggunakan mock to stub return values ​​untuk metodenya dan memverifikasi jika mereka dipanggil.

Mari kita lihat contohnya:

@Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned() { UserRepository localMockRepository = Mockito.mock(UserRepository.class); Mockito.when(localMockRepository.count()).thenReturn(111L); long userCount = localMockRepository.count(); Assert.assertEquals(111L, userCount); Mockito.verify(localMockRepository).count(); }

Metode ini tidak memerlukan hal lain untuk dilakukan sebelum dapat digunakan. Kita bisa menggunakannya untuk membuat bidang kelas tiruan serta tiruan lokal dalam sebuah metode.

3. Anotasi @Mock Mockito

Anotasi ini adalah singkatan dari metode Mockito.mock () . Selain itu, kami hanya boleh menggunakannya di kelas pengujian. Tidak seperti metode mock () , kita perlu mengaktifkan anotasi Mockito untuk menggunakan anotasi ini.

Kita bisa melakukan ini baik dengan menggunakan MockitoJUnitRunner untuk menjalankan pengujian atau memanggil metode MockitoAnnotations.initMocks () secara eksplisit.

Mari kita lihat contoh menggunakan MockitoJUnitRunner :

@RunWith(MockitoJUnitRunner.class) public class MockAnnotationUnitTest { @Mock UserRepository mockRepository; @Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() { Mockito.when(mockRepository.count()).thenReturn(123L); long userCount = mockRepository.count(); Assert.assertEquals(123L, userCount); Mockito.verify(mockRepository).count(); } }

Selain membuat kode lebih mudah dibaca, @Mock memudahkan untuk menemukan tiruan masalah jika terjadi kegagalan, karena nama bidang muncul di pesan kegagalan:

Wanted but not invoked: mockRepository.count(); -> at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22) Actually, there were zero interactions with this mock. at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22) 

Selain itu, jika digunakan bersama dengan @InjectMocks , ini dapat mengurangi jumlah kode penyiapan secara signifikan.

4. Anotasi @MockBean Spring Boot

Kita bisa menggunakan @MockBean untuk menambahkan objek tiruan ke konteks aplikasi Spring. Tiruan tersebut akan menggantikan kacang yang ada dari jenis yang sama dalam konteks aplikasi.

Jika tidak ada kacang dengan jenis yang sama yang ditentukan, kacang baru akan ditambahkan. Anotasi ini berguna dalam pengujian integrasi di mana kacang tertentu - misalnya, layanan eksternal - perlu diolok-olok.

Untuk menggunakan anotasi ini, kita harus menggunakan SpringRunner untuk menjalankan pengujian:

@RunWith(SpringRunner.class) public class MockBeanAnnotationIntegrationTest { @MockBean UserRepository mockRepository; @Autowired ApplicationContext context; @Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() { Mockito.when(mockRepository.count()).thenReturn(123L); UserRepository userRepoFromContext = context.getBean(UserRepository.class); long userCount = userRepoFromContext.count(); Assert.assertEquals(123L, userCount); Mockito.verify(mockRepository).count(); } }

Saat kami menggunakan anotasi di lapangan, serta terdaftar dalam konteks aplikasi, tiruan juga akan dimasukkan ke dalam bidang.

Ini terbukti pada kode di atas. Di sini, kami telah menggunakan tiruan UserRepository yang diinjeksi untuk menghentikan metode penghitungan . Kami kemudian menggunakan kacang dari konteks aplikasi untuk memverifikasi bahwa itu memang kacang tiruan.

5. Kesimpulan

Dalam artikel ini, kami melihat bagaimana tiga metode untuk membuat objek tiruan berbeda dan bagaimana masing-masing dapat digunakan.

Kode sumber yang menyertai artikel ini tersedia di GitHub.