Masalah sinkronisasi muncul setiap kali strategi pengujian dibahas. Pada dasarnya - karena beban tambahan yang dibuat mokas untuk pengembang dan juga risiko mooks menyimpang dari dependensi nyata.
Jadi, dengan cara apa lebih murah bagi kita untuk memastikan sinkronisasi moka dengan implementasi nyata?
Untuk sinkronisasi, kita dapat menulis tes yang melakukan pemeriksaan yang sama terhadap mok dan implementasi nyata.
Ini terlihat seperti ini (saya menulis tanpa DI, tetapi dengan DI lebih sederhana dan lebih benar):
public abstract class AbstractValidOrderDaoTest(){ Dao dao; public abstract arrange(); @Test public void whenValidOrderInDb_thenReturnValidOrder(){ arrange(); Order order = dao.retrieve(); assertNotNull(order); assertNotNull(order.getCustomerName());
OrderDaoTest bekerja melawan objek nyata dengan tiruan yang mendasari atau ketergantungan nyata, dan ValidOrderDaoTest bekerja melawan tiruan.
Jika ValidOrderDataSource adalah database nyata, maka OrderDaoTest akan berada dalam paket terpisah dan dijalankan sebagai bagian dari tes integrasi, yang mungkin macet dari waktu ke waktu saat memperbarui database, misalnya. Ini seharusnya tidak mengganggu CI \ CD.
Jika ValidOrderDataSource adalah database tiruan, maka OrderDaoTest akan diluncurkan bersama dengan sisa unit tes.
Karena sinkronisasi Mock melibatkan pengujian kelas nyata, maka untuk
kelas nyata harus mencoba-coba dependensi yang mendasarinya. Selain itu, kecanduan Mok yang mendasari harus berperilaku sesuai dengan skenario Mok atasnya. Dalam kasus kami, ini
ValidOrderDataSource.
Jika Anda memikirkannya, masuk akal - pernyataan apa pun tentang perilaku kelas yang lebih tinggi secara implisit menyiratkan beberapa skenario pada yang mendasarinya. Jika controller mengembalikan sesuatu dari layanan, alangkah baiknya jika basis dapat menyediakannya.
Sebaliknya, kelas yang lebih tinggi sering hidup dengan ide-ide yang tidak realistis tentang kelas yang lebih rendah, sehingga tidak buruk untuk menghapus skrip yang tidak perlu.
Rekursi ini menunjukkan bahwa untuk membuat tiruan tingkat atas disinkronkan, Anda perlu memulai sinkronisasi semua tiruan yang mendasarinya hingga ketergantungan eksternal.
Ini membuat spesifikasi sistem menjadi lebih transparan, karena skenario yang lebih umum dan abstrak bergantung pada skenario yang lebih pribadi.
Perhatikan juga bahwa ada moka yang tidak perlu disinkronkan. Yaitu kami tidak memiliki implementasi nyata yang perlu diuji silang. Ini berlaku untuk skenario kesalahan utama. EmptyResultException_Datasource mis. Ini sangat mengurangi jumlah uji silang yang diperlukan.
Sinkronisasi tentu diperlukan oleh dependensi eksternal nyata, seperti antrian, layanan eksternal, basis data - terutama yang berkaitan dengan data yang mereka ambil dan kembalikan.
Jika layanan eksternal tiba-tiba berubah, yang sering dalam tahap pengembangan, kami tidak memiliki cara untuk memeriksa perilakunya jika kami tidak menulis tes sinkronisasi.
Dalam hal intensitas tenaga kerja. Dalam dirinya sendiri, kami sudah memiliki tes kelas nyata dengan beberapa dependensi tiruan sewenang-wenang. Dibandingkan dengan tes yang tidak disinkronkan, kita perlu melakukan beberapa hal.
- sorot tindakan dan nyatakan dalam tes abstrak
- buat tes khusus untuk moka
- memperbaiki dependensi tiruan dalam tes kelas nyata
- jika diinginkan, ulangi secara rekursif sepenuhnya sampai ke dependensi eksternal.