Apa perbedaan antara @Mock
dan @InjectMocks
dalam kerangka kerja Mockito?
java
unit-testing
mocking
mockito
pengguna2249972
sumber
sumber
Jawaban:
@Mock
menciptakan tiruan.@InjectMocks
membuat instance kelas dan menyuntikkan tiruan yang dibuat dengan@Mock
(atau@Spy
) anotasi ke dalam instance ini.Perhatikan bahwa Anda harus menggunakan
@RunWith(MockitoJUnitRunner.class)
atauMockito.initMocks(this)
menginisialisasi tiruan ini dan menyuntikkannya.sumber
Ini adalah kode sampel tentang cara
@Mock
dan cara@InjectMocks
kerjanya.Katakanlah kita memiliki
Game
danPlayer
kelas.Seperti yang Anda lihat,
Game
kelas perluPlayer
melakukanattack
.Mockito akan mengejek kelas Player dan perilakunya menggunakan
when
danthenReturn
metode. Terakhir, menggunakan@InjectMocks
Mockito akan memasukkannyaPlayer
ke dalamGame
.Perhatikan bahwa Anda bahkan tidak perlu membuat
new Game
objek. Mockito akan menyuntikkannya untukmu.Kami juga akan mendapatkan perilaku yang sama menggunakan
@Spy
anotasi. Bahkan jika nama atributnya berbeda.Itu karena Mockito akan memeriksa
Type Signature
kelas Game, yaituPlayer
danList<String>
.sumber
Di kelas tes Anda, kelas yang diuji harus diberi penjelasan
@InjectMocks
. Ini memberitahu Mockito kelas mana yang akan diinjeksi:Sejak saat itu, kita dapat menentukan metode atau objek spesifik apa di dalam kelas, dalam hal ini
SomeManager
, yang akan diganti dengan mengejek:Dalam contoh ini,
SomeDependency
di dalamSomeManager
kelas akan diejek.sumber
@Mock
anotasi mengolok-olok objek yang bersangkutan.@InjectMocks
anotasi memungkinkan untuk menyuntikkan ke objek yang mendasari berbagai (dan relevan) tiruan yang dibuat oleh@Mock
.Keduanya saling melengkapi.
sumber
@InjectMocks
untuk membangun kelas ini dan memata-matai juga.Sebagai contoh
Di sini kita membutuhkan kelas DAO untuk kelas layanan. Jadi, kami mengejeknya dan menyuntikkannya dalam instance kelas layanan. Demikian pula, dalam kerangka Spring semua kacang @Autowired dapat diejek oleh @Mock di jUnits dan disuntikkan ke kacang Anda melalui @InjectMocks.
MockitoAnnotations.initMocks(this)
Metode menginisialisasi tiruan ini dan menyuntikkan mereka untuk setiap metode pengujian sehingga perlu disebut dalamsetUp()
metode.Tautan ini memiliki tutorial yang bagus untuk kerangka kerja Mockito
sumber
"Kerangka kerja mengejek", yang menjadi dasar Mockito, adalah kerangka kerja yang memberi Anda kemampuan untuk membuat objek Mock (dalam istilah lama objek-objek ini bisa disebut shunts, karena mereka berfungsi sebagai shunt untuk fungsionalitas dependend) Dengan kata lain, mock objek digunakan untuk meniru objek nyata yang menjadi sandaran kode Anda, Anda membuat objek proxy dengan kerangka kerja mengejek. Dengan menggunakan objek tiruan dalam pengujian Anda, Anda pada dasarnya beralih dari pengujian unit normal ke pengujian integrasi
Mockito adalah kerangka kerja pengujian sumber terbuka untuk Java yang dirilis di bawah Lisensi MIT, ini adalah "kerangka kerja mengejek", yang memungkinkan Anda menulis tes yang indah dengan API bersih dan sederhana. Ada banyak kerangka kerja mengejek yang berbeda di ruang Java, namun pada dasarnya ada dua jenis kerangka kerja objek tiruan, yang diimplementasikan melalui proxy dan yang diimplementasikan melalui kelas remapping.
Kerangka kerja injeksi ketergantungan seperti Spring memungkinkan Anda untuk menyuntikkan objek proxy Anda tanpa mengubah kode apa pun, objek tiruan mengharapkan metode tertentu untuk dipanggil dan itu akan mengembalikan hasil yang diharapkan.
The
@InjectMocks
penjelasan mencoba untuk instantiate contoh dan menyuntikkan pengujian objek bidang dijelaskan dengan@Mock
atau@Spy
dalam bidang swasta dari objek pengujian.MockitoAnnotations.initMocks(this)
panggilan, reset objek pengujian dan inisialisasi ulang mengejek, jadi ingatlah untuk memiliki ini di@Before
/@BeforeMethod
anotasi Anda.sumber
Satu keuntungan yang Anda dapatkan dengan pendekatan yang disebutkan oleh @Tom adalah bahwa Anda tidak harus membuat konstruktor di SomeManager, dan karenanya membatasi klien untuk membuat instantiate.
Apakah ini praktik yang baik atau tidak tergantung pada desain aplikasi Anda.
sumber
Banyak orang telah memberikan penjelasan yang besar di sini sekitar
@Mock
vs@InjectMocks
. Saya suka, tapi saya pikir tes dan aplikasi kami harus ditulis sedemikian rupa sehingga kita tidak perlu menggunakannya@InjectMocks
.Referensi untuk bacaan lebih lanjut dengan contoh: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
sumber
@Mock
digunakan untuk mendeklarasikan / mengejek referensi kacang tergantung, sedangkan@InjectMocks
digunakan untuk mengejek kacang dimana tes sedang dibuat.Sebagai contoh:
tes untuk kelas
A
:sumber
Penjelasan @InjectMocks dapat digunakan untuk menyuntikkan bidang tiruan ke dalam objek uji secara otomatis.
Dalam contoh di bawah ini, @InjectMocks telah digunakan untuk menyuntikkan mock dataMap ke dalam dataLibrary.
sumber
Perhatikan bahwa
@InjectMocks
akan segera ditinggalkandan Anda dapat mengikuti @avp jawaban dan tautan di:
sumber
Meskipun jawaban di atas telah dibahas, saya baru saja mencoba untuk menambahkan detail menit yang saya lihat hilang. Alasan di belakang mereka (The Why).
Ilustrasi:
Referensi
sumber