Ketika unit menguji fungsi kelas yang memiliki fungsi pribadi yang memerlukan fungsionalitas online. Bagaimana cara mengujinya?
Sebagai contoh:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Jika saya menguji fungsi: 'methodA ()' ia akan mencoba menggunakan 'goOnlineToGetVal ()' yang pada gilirannya akan mencoba online, jika tes ini dilakukan tanpa fungsionalitas. Bagaimana saya bisa menjangkau sekitar 100% cakupan Kelas tanpa online?
unit-testing
junit
Ben Crazed Up Euden
sumber
sumber
Jawaban:
new CloudService()
Dan ini masalahnya.
Desain OO modern merekomendasikan bahwa ketergantungan semacam ini dilewatkan daripada dibangun secara langsung. Ini dapat diteruskan ke fungsi itu sendiri, atau ke kelas pada waktu konstruksi. Itu juga bisa diambil atau diagregasi oleh wadah Inversion of Control jika kompleksitas semacam itu diperlukan.
Pada saat itu, menjadi sangat sepele untuk memberikan layanan tiruan / palsu untuk memberi Anda data "online" Anda selama pengujian. Lebih baik lagi, ini memungkinkan perangkat lunak Anda menjadi cukup fleksibel, sehingga Anda dapat dengan cepat beradaptasi jika beberapa klien (pemerintah?) Datang dan tidak ingin menggunakan cloud untuk nilai-nilai mereka. Atau Anda ingin membuang satu penyedia cloud untuk yang lain. Atau...
sumber
Saya akan menerapkannya seperti ini:
Antarmuka
ICloudService
dapat diimplementasikan dengan tiruan untuk pengujian, atau dengan layanan cloud "nyata". Saat instantiasinew CloudService()
wajib untuk setiap panggilangetValueFromService
, atauCloudService
berasal dari API pihak ke-3 yang tidak dapat diubah, terapkan pembungkus, yang berasal dari,ICloudService
dan lakukan panggilan yang sesuai.sumber