Saya sedang melakukan pengujian unit dan di salah satu kelas saya, saya perlu mengirim email dari salah satu metode, jadi menggunakan injeksi konstruktor saya menyuntikkan contoh Zend_Mail
kelas yang ada di kerangka Zend.
Sekarang beberapa orang berpendapat bahwa jika perpustakaan cukup stabil dan tidak akan sering berubah maka tidak perlu membungkusnya. Jadi dengan asumsi itu Zend_Mail
stabil dan tidak akan berubah dan itu sesuai dengan kebutuhan saya sepenuhnya, maka saya tidak akan memerlukan pembungkus untuk itu.
Sekarang lihat kelas saya Logger
yang tergantung pada Zend_Mail
:
class Logger{
private $mailer;
function __construct(Zend_Mail $mail){
$this->mail=$mail;
}
function toBeTestedFunction(){
//Some code
$this->mail->setTo('some value');
$this->mail->setSubject('some value');
$this->mail->setBody('some value');
$this->mail->send();
//Some
}
}
Namun, pengujian Unit menuntut saya menguji satu komponen pada satu waktu, jadi saya perlu mengejek Zend_Mail
kelas. Selain itu saya melanggar prinsip Ketergantungan Pembalikan karena Logger
kelas saya sekarang tergantung pada konkret bukan abstraksi.
Sekarang bagaimana saya bisa menguji Logger
dalam isolasi tanpa pembungkus Zend_Mail
?!
Kode ini dalam PHP, tetapi jawabannya tidak harus. Ini lebih merupakan masalah desain daripada fitur khusus bahasa
Jawaban:
Anda selalu ingin membungkus tipe dan metode pihak ketiga di belakang sebuah antarmuka. Ini bisa membosankan dan menyakitkan. Terkadang Anda dapat menulis generator kode atau menggunakan alat untuk melakukan ini.
Tetapi jangan tergoda untuk menggunakan metode atau tipe pustaka di seluruh kode Anda. Untuk memulainya, Anda akan kesulitan menulis unit test. Kemudian lisensi akan berubah, atau Anda ingin pergi ke platform yang tidak didukung oleh pihak ketiga, dan Anda akan menemukan bahwa tipe dan dependensi tersebut telah terjalin di dalam dan di sekitar semua kelas Anda yang lain.
Kemampuan untuk mengubah vendor pihak ketiga dengan cepat adalah keuntungan besar.
sumber