Test Doubles: Mock and Stub
Dalam sebuah automated testing merupakan hal yang wajar untuk menggunakan objek yang terlihat dan memiliki behavior seperti padanan production-nya, tetapi sebenernya udah disederhanakan. Hal ini mengurangi complexity, dan memperbolehkan untuk verify code independently dari the rest of the system. Bahkan terkadang perlu untuk execute self validating test secara keseluruhan.
Pernah ngga sih lagi bikin test tapi bingung gimana caranya nge-test suatu objects atau yang lainnya?
Ada yang namanya Test Doubles. Kalau menurut website martinfowler.com, Test Double is a generic term for any case where you replace a production object for testing purposes. Jadi Test Doubles ini digunakan sebagai pengganti external dependencies. Lebih jelasnya, Test Doubles ini membantu kita ketika pengen memanggil sebuah class/object di dalam testClass. Karena ada saatnya ketika class yang kita panggil itu terlalu kompleks dan terlalu banyak external dependencies yang tidak dibutuhkan waktu testing.
Mock
Mock itu dapat dikatakan sebagai suatu mekanisme untuk memvalidasi bagaimana sebuah dependency digunakan di suatu class. Mock digunakan ketika test membutuhkan class performs specific actions on the dependency.
Tujuan pemakain mock object itu intinya mengisolasi class yang di-test supaya tidak terpengaruh sama class lain (Test Isolation) dan supaya kita bisa bergerak bebas atau mengontrol ketergantungan dari class yang di-test itu.
Misalkan yang berwarna Merah ini pengen ditest tapi ternyata dia punya object window dari class Window. Karena “unit test”, kita ngga perlu men-test si object window juga. Pada class MerahTest.java, dibuatlah dummy dari object window dimana hal ini dinamakan Mocking.
Contoh lainnya misalkan ada sebuah fungsionalitas yang memanggil e-mail untuk mengirim service. Kita ngga mau ngirim e-mail setiap kali kita mau jalanin test. Susah untuk ngecek di test kalo e-mail yang bener udah dikirim. Satu-satunya cara untuk kita verify output-nya adalah dengan mencobanya di test. Dengan kata lain, verify that e-mail sending service was called.
Stub
Stub, mechanism for injecting data directly into the class.
Stub digunakan ketika kita mau (ceritanya) mengambil data dari database, jad kita bikin data dummy supaya bisa di-test what data should be returned.
public class GradesService {
private final Gradebook gradebook; public GradesService(Gradebook gradebook) {
this.gradebook = gradebook;
}
Double averageGrades(Student student) {
return average(gradebook.gradesFor(student));
}
}
Berdasarkan contoh diatas, pada saat student ingin menjalankan code averageGrades, dia akan memanggil object grades dan object grades ini akan melakukan pemanggilan ke database.
Stub testing ini tidak mengharuskan kita mengakses database ketika pengen men-test code grades tadi. Kita cukup buat dummy seolah-olah code nya udah melakukan callbacks ke database dan get data.
Implementasi
Berikut merupakan contoh implementasi pada pengerjaan proyek kami. Membuat test untuk mengetest fungsionalitas upload file dan delete form
References