Pendahuluan

Kalau sebelumnya kita sudah tahu mengenai Test Double, maka sekarang kita akan melihat apa saja jenis objek dari Test Double ini.

Namun sepertinya kita perlu melihat kembali definisi Test Double , sbb :

Test Double adalah objek tiruan yang berfungsi untuk menggantikan objek aslinya yang dibutuhkan oleh Objek yang kita testing.

Objek tiruan ini adalah tiruan dari objek-objek yang dibutuhkan oleh Objek yang sedang kita test.

Misalkan di aplikasi e-commerce, objek yang akan kita testing bernama OrderService membutuhkan objek-objek seperti :

  • OrderRepository untuk koneksi ke tabel database.
  • OrderHelper sebagai objek utilitas untuk Order.
  • EmailService sebagai objek untuk mengirim email kepada pengguna yang melakukan order.
  • dll.

Objek-objek OrderRepository , OrderHelper, atau EmailService ini disebut sebagai Collaborator karena mereka berkolaborasi untuk membentuk class OrderService dan oleh karena itu perlu dipertimbangkan bagaimana menanganinya, karena fokus kita sebenarnya bukan untuk melakukan testing untuk objek-objek collaborator tersebut, tetapi terhadap objek OrderService

Kita perlu memastikan bahwa ketika memanggil objek-objek tersebut, kita tidak ingin melakukan proses aslinya.

Misalnya ketika memanggil OrderRepository, kita tidak ingin data yang kita test masuk ke dalam database, karena bisa menjadi data sampah, karena hanya terkait dengan data test.

Oleh karena itu kita menggunakan salah satu dari 5 jenis Test Double berikut :



1. Objek Dummy


Objek Dummy adalah objek tiruan yang dibuat untuk meminimalkan ketergantungan terhadap sebuah objek yang struktur objek nya mungkin rumit didalamnya.

Misalkan objek AlamatService yang fungsinya berhubungan dengan Alamat. Didalam service ini kita membutuhkan objek Alamat.

Akan tetapi objek Alamat hanya digunakan sebagai parameter objek AlamatService saja. Hanya butuh dipassing parameter objek ini ketika membuat/menginstansiasi objek AlamatService.

Oleh karenanya kita sebenarnya tidak membutuhkan kerumitan objek tersebut, sehingga mungkin kita cukup memanggil konstruktor dari object tersebut dan membuat objek tersebut hanya Dummy objek saja. Kita tidak perlu melakukan sesuatu yang rumit untuk membuat objek tersebut.



2. Objek Fake


Objek Fake adalah objek tiruan yang didalamnya ada implementasinya atau codenya, tetapi biasanya sudah dimodifikasi agar tidak melakukan proses yang membahayakan seperti yang dilakukan semestinya oleh objek aslinya. Misalnya objek OrderRepository dimana objek aslinya akan melakukan proses CRUD ke database.

Akan tetapi dengan objek Fake ini, code CRUD di dalam objek tiruan OrderRepository ini akan dimodifikasi agar misalnya cuma mengirimkan message ke logger saja.

Atau bisa saja diganti dengan melakukan CRUD ke database bertipe memori database.



3. Objek Stub


Objek Stub adalah objek tiruan yang ditujukan untuk mengontrol Indirect Input atau nilai kembalian dari sebuah fungsi yang mempengaruhi alur atau fungsi lain di dalam objek yang sedang kita test.

Objek Stub lebih ditujukan untuk mengontrol flow dan response dari sebuah objek agar sesuai dengan alur testing yang kita inginkan. Oleh karenanya di dalam objek Stub kita mesti mendefinisikan response apa yang harus kita setting terhadap sebuah fungsi.

Object Stub bisa saja dibutuhkan untuk menguji alur proses ketika ternyata implementasi dari object collaborator belum selesai (karena mungkin saja tim lain yang mengerjakannya, dll)

Dan Objek Stub ini ditujukan bukan buat menverifikasi indirect input ataupun behaviour.

Verifikasi behaviour dilakukan oleh objek Mock atau Stub



4. Objek Spy


Objek Spy adalah objek tiruan yang ditujukan untuk mengontrol Indirect Input atau nilai kembalian dari sebuah fungsi yang mempengaruhi alur atau fungsi lain di dalam objek yang sedang kita test.

Kemudian melakukan verifikasi belakangan terhadap indirect input atau behaviour terhadap objek collaborator yang dipanggil.

Jadi objek Spy ini seperti objek Stub tetapi dengan kemampuan tambahan untuk menyimpan hasil kembalian dari fungsi dan behaviournya, untuk nanti bisa diverifikasi.

Verifikasinya juga cuma untuk mengecek behavior yang semestinya terjadi. Jadi behaviournya bukan untuk dengan cara memanipulasi expected nya dahulu , lalu di verifikasi. Hal itu mestinya dilakukan di objeck Mock, bukan di objek Spy ini.

Object Spy ini tidak menentukan dari awal ekspektasi yang diinginkan, akan tetapi lebih kepada mencatat behaviour dan hasilnya, lalu diverifikasi saja tanpa harus ada setting sesuatu.



5. Objek Mock


Objek Mock adalah objek tiruan yang ditujukan untuk mengontrol dan menverifikasi Indirect Input atau nilai kembalian dari sebuah fungsi yang mempengaruhi alur atau fungsi lain di dalam objek yang sedang kita test.

Jadi objek Mock ini sudah disetting dari awal mengenai expected behaviour dan indirect inputnya.

Lalu waktu melakukan pemanggilan, akan dilakukan verifikasi behaviour dan indirect inputnya.


Kesimpulan

Jenis Test Double diatas adalah pengelompokan yang dilakukan oleh Gerard Meszaros yang berjudul XUnit Test Pattern, Refactoring Test Code.

Didalam kenyataannya, bisa saja ke lima jenis Test Double ini dipakai dalam unit testing kita.

Akan tetapi dengan menggunakan framework unit testing, biasanya kita cukup menggunakan jenis Mock dan Spy saja, karena biasanya framework unit testing sudah mempermudah dalam membuat 2 jenis Test Double tersebut.

Ingin tahu ttg JUnit ?

Mengenai Pendahuluan JUnit , bisa dilihat di sini

Mengenai JUnit 5 , bisa dilihat di sini