Pendahuluan

Didalam membuat unit testing misalnya ketika menggunakan library java Mockito, kita menemukan 2 jenis mocking.

  1. Mocking dengan @Mock atau dengan mock()

  2. Mocking dengan @Spy atau dengan spy()

Apa perbedaannya ?

Kedua anotasi / command diatas digunakan untuk meniru (mocking) objek asli yang terlibat dalam unit testing kita.

Secara istilah ,dua anotasi/command diatas yaitu Mock dan Spy adalah salah dua dari jenis dari Test Double.

Perbedaan antara keduanya adalah :

  • @Mock/mock artinya kita membuat sebuah object perantara yang kosongan, dan tidak memiliki attribute dan method apapun ketika dibuat, kecuali nanti kita definisikan pakai stubbing.
  • @Spy/spy artinya kita membuat sebuah object perantara yang ketika dipanggil, maka akan memanggil fungsi objek aslinya. Sehingga secara tidak langsung @Spy objek akan mempunyai semua fungsi dari objek aslinya ketika dibuat, kecuali nanti kita manipulasi pakai stubbing.

Sederhanya , begini :

mock seperti kita membuat sebuah gelas kosongan, sampai kita tambahkan air sebanyak yang kita butuhkan.

spy seperti kita membuat sebuah gelas penuh berisi air, sampai kita kurangi airnya.

Informasi lain

Tim Mockito sebenarnya tidak menganjurkan Spy, karena mencerminkan desain yang jelek dari sebuah unit testing.

Hal ini karena ide unit testing dari mockito adalah isolasi dependensi dari objek.

Dengan Spy, maka isolasi dependensi menjadi terbalik penggunaannya, walaupun kita bisa melakukan stubbing terhadap fungsi yang kita inginkan.

Spy disebut juga sebagai Partial Mock, karena dari awal default objeknya adalah objeck real (walaupun lewat proxy), bukan benar-benar objek mock yang kosongan. Sehingga istilah mock untuk Spy ini hanya ketika dibutuhkan saja, bukan sejak dari awal mocking objek nya dibuat.

Kapan menggunakan Mock dan kapan menggunakan Spy ?

  • Gunakan mock ketika ingin menjalankan unit testing dan hanya ingin mentes bagian/logic tertentu dari program kita.
  • Gunakan spy ketika ketika kita butuh hampir semua fungsi dari objek tersebut untuk ditest, dan hanya ingin memanipulasi method tertentu saja.