Kodunuzu biraz yeniden düzenlemenizi öneririm. Sadece kodunuzu test etmek için yansıma veya başka tür şeyler kullanmayı düşünmeniz gerektiğinde, kodunuzla ilgili bir sorun var.
Farklı sorun türlerinden bahsettiniz. Özel alanlarla başlayalım. Özel alanlar durumunda, yeni bir kurucu ekledim ve buna enjekte edilen alanlar ekleyecektim. Bunun yerine:
public class ClassToTest {
private final String first = "first";
private final List<String> second = new ArrayList<>();
...
}
Bunu kullanırdım:
public class ClassToTest {
private final String first;
private final List<String> second;
public ClassToTest() {
this("first", new ArrayList<>());
}
public ClassToTest(final String first, final List<String> second) {
this.first = first;
this.second = second;
}
...
}
Bazı eski kodlarda bile bu sorun olmaz. Eski kod boş bir kurucu kullanacak ve bana sorarsanız, yeniden düzenlenmiş kod daha temiz görünecek ve yansıma olmadan testte gerekli değerleri enjekte edebileceksiniz.
Şimdi özel yöntemler hakkında. Kişisel deneyimlerime göre, test için özel bir yöntemi saplamak zorunda kaldığınızda, o yöntemin o sınıfta bir ilgisi yoktur. Ortak bir desen, bu durumda, bir arayüz içine sarmak gibi olur Callable
ve daha sonra bu arayüze yapıcıda da (bu çoklu kurucu hile ile) geçersiniz:
public ClassToTest() {
this(...);
}
public ClassToTest(final Callable<T> privateMethodLogic) {
this.privateMethodLogic = privateMethodLogic;
}
Çoğunlukla yazdığım tek şey bağımlılık enjeksiyon modeli gibi görünüyor. Kişisel deneyimlerime göre test ederken bu gerçekten kullanışlı ve bence bu tür kodlar daha temiz ve bakımı daha kolay olacak. Aynı şeyi iç içe dersler için de söyleyebilirim. Yuvalanmış bir sınıf ağır mantık içeriyorsa, onu bir paket özel sınıfı olarak taşıdıysanız ve buna ihtiyaç duyan bir sınıfa enjekte etseniz daha iyi olur.
Ayrıca eski kodu yeniden düzenlerken ve korurken kullandığım birkaç tasarım deseni daha var, ancak hepsi test etmek için kodunuzun durumlarına bağlı. Yansımayı kullanmak çoğunlukla bir sorun değildir, ancak yoğun bir şekilde test edilen ve her dağıtımdan önce testler yapılan bir kurumsal uygulamanız olduğunda her şey gerçekten yavaşlar (sadece sinir bozucu ve bu tür şeyleri sevmiyorum).
Ayrıca setter enjeksiyonu var, ama kullanmanızı tavsiye etmem. Bir kurucuya bağlı kalsam ve gerçekten gerekli olduğunda her şeyi başlatırsam, gerekli bağımlılıkları enjekte etme olasılığını bırakırsam.