Mockito.mock () vs @Mock vs @MockBean

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat tiga cara berbeza untuk membuat objek tiruan dan bagaimana ia berbeza antara satu sama lain - dengan Mockito dan dengan sokongan mengejek Spring.

2. Mockito.mock ()

Kaedah Mockito.mock () membolehkan kita membuat objek tiruan kelas atau antara muka.

Kemudian, kita dapat menggunakan tiruan untuk mengekang nilai kembali untuk kaedahnya dan mengesahkan jika mereka dipanggil.

Mari lihat contoh:

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

Kaedah ini tidak memerlukan perkara lain untuk dilakukan sebelum dapat digunakan. Kita dapat menggunakannya untuk membuat medan kelas tiruan dan juga ejekan tempatan dalam satu kaedah.

3. Anotasi Mockito @Mock

Anotasi ini adalah singkatan untuk kaedah Mockito.mock () . Kita juga harus menggunakannya dalam kelas ujian sahaja. Tidak seperti kaedah mock () , kita perlu mengaktifkan anotasi Mockito untuk menggunakan anotasi ini.

Kita boleh melakukannya dengan menggunakan MockitoJUnitRunner untuk menjalankan ujian atau memanggil kaedah MockitoAnnotations.initMocks () secara eksplisit.

Mari 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 kod lebih mudah dibaca, @Mock menjadikannya lebih mudah untuk mencari masalah tiruan sekiranya berlaku kegagalan, kerana nama bidang muncul dalam mesej 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) 

Juga, apabila digunakan bersama dengan @InjectMocks , ia dapat mengurangkan jumlah kod persediaan dengan ketara.

4. Anotasi Spring Boot's @MockBean

Kita boleh menggunakan @MockBean untuk menambahkan objek tiruan ke konteks aplikasi Spring. Mock akan menggantikan kacang yang ada dengan jenis yang sama dalam konteks aplikasi

Sekiranya tidak ada kacang jenis yang sama, yang baru akan ditambahkan. Anotasi ini berguna dalam ujian integrasi di mana kacang tertentu - misalnya, perkhidmatan luaran - perlu diejek.

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

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

Apabila kita menggunakan anotasi di lapangan, dan juga didaftarkan dalam konteks aplikasi, tiruan juga akan disuntik ke lapangan.

Ini terbukti dalam kod di atas. Di sini, kami telah menggunakan disuntik UserRepository contoh kepada puntung yang kiraan kaedah . Kami kemudian menggunakan kacang dari konteks aplikasi untuk mengesahkan bahawa ia benar-benar kacang tiruan.

5. Kesimpulan

Dalam artikel ini, kami melihat bagaimana ketiga kaedah untuk membuat objek palsu berbeza dan bagaimana masing-masing dapat digunakan.

Kod sumber yang menyertai artikel ini terdapat di GitHub.