मैं आपको सुझाव दूंगा कि आप अपने कोड को थोड़ा सा रिफ्लेक्ट कर रहे हैं। जब आपको अपने कोड का परीक्षण करने के लिए प्रतिबिंब या अन्य प्रकार के सामान का उपयोग करना शुरू करना होगा, तो आपके कोड में कुछ गलत हो रहा है।
आपने विभिन्न प्रकार की समस्याओं का उल्लेख किया। निजी क्षेत्रों से शुरू करते हैं। निजी क्षेत्रों के मामले में मैंने एक नया कंस्ट्रक्टर और इंजेक्शन क्षेत्रों को इसमें जोड़ा होगा। इसके अलावा:
public class ClassToTest {
private final String first = "first";
private final List<String> second = new ArrayList<>();
...
}
मैंने इसका उपयोग किया है:
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;
}
...
}
यह कुछ विरासत कोड के साथ भी समस्या नहीं होगी। पुराना कोड एक खाली कंस्ट्रक्टर का उपयोग किया जाएगा, और यदि आप मुझसे पूछते हैं, तो रिफलेक्ट किए गए कोड क्लीनर दिखेंगे, और आप प्रतिबिंब के बिना परीक्षण में आवश्यक मानों को इंजेक्ट कर पाएंगे।
अब निजी तरीकों के बारे में। मेरे व्यक्तिगत अनुभव में जब आपको परीक्षण के लिए एक निजी पद्धति को ठोकर मारना पड़ता है, तो उस पद्धति का उस कक्षा में कुछ भी नहीं होता है। एक सामान्य पैटर्न, उस स्थिति में, इसे एक इंटरफ़ेस के भीतर लपेटना होगा, जैसे कि Callable
और फिर आप उस इंटरफ़ेस में भी कंस्ट्रक्टर में (उस कई कंस्ट्रक्टर ट्रिक के साथ) पास करते हैं:
public ClassToTest() {
this(...);
}
public ClassToTest(final Callable<T> privateMethodLogic) {
this.privateMethodLogic = privateMethodLogic;
}
ज्यादातर सभी जो मैंने लिखा है, ऐसा लगता है कि यह एक निर्भरता इंजेक्शन पैटर्न है। मेरे व्यक्तिगत अनुभव में यह परीक्षण करते समय वास्तव में उपयोगी है, और मुझे लगता है कि इस तरह का कोड क्लीनर है और इसे बनाए रखना आसान होगा। मैं नेस्टेड क्लासेस के बारे में भी यही कहूंगा। यदि किसी नेस्टेड क्लास में भारी तर्क होते हैं तो बेहतर होगा कि आप इसे पैकेज प्राइवेट क्लास के रूप में ले जाएँ और इसे ज़रूरत की क्लास में इंजेक्ट करें।
कई अन्य डिज़ाइन पैटर्न भी हैं जिनका उपयोग मैंने विरासत कोड को रीफ़ैक्टर करने और बनाए रखने के दौरान किया है, लेकिन यह सब आपके कोड के मामलों पर निर्भर करता है। परावर्तन का उपयोग करना ज्यादातर एक समस्या नहीं है, लेकिन जब आपके पास एक एंटरप्राइज़ एप्लिकेशन होता है जो कि बहुत अधिक परीक्षण किया जाता है और हर तैनाती से पहले परीक्षण चलाए जाते हैं तो सब कुछ वास्तव में धीमा हो जाता है (यह सिर्फ कष्टप्रद है और मुझे उस तरह का सामान पसंद नहीं है)।
सेटर इंजेक्शन भी है, लेकिन मैं इसका उपयोग करने की सिफारिश नहीं करूंगा। मैं एक कंस्ट्रक्टर के साथ रहना चाहता हूं और जब आवश्यक हो तो सब कुछ इनिशियलाइज़ कर सकता हूं, जिससे आवश्यक निर्भरता को इंजेक्ट करने की संभावना बढ़ जाएगी।