मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं, जहां क्लास इंटरनल कॉल्स सामान्य हैं, लेकिन परिणाम कई बार सरल होते हैं। उदाहरण ( वास्तविक कोड नहीं ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
इस प्रकार के कोड के लिए इकाई परीक्षण लिखना वास्तव में कठिन है क्योंकि मैं केवल स्थिति प्रणाली का परीक्षण करना चाहता हूं न कि वास्तविक परिस्थितियों के कार्यान्वयन का। (मैं अलग-अलग परीक्षणों में ऐसा करता हूं।) वास्तव में यह बेहतर होगा यदि मैं ऐसे कार्यों को पारित करूं जो शर्तों को लागू करते हैं और परीक्षणों में मैं बस कुछ नकली प्रदान करता हूं। इस दृष्टिकोण के साथ मुद्दा नीरवता है: हम जेनेरिक का बहुत उपयोग करते हैं ।
एक काम कर समाधान; हालाँकि, परीक्षण की गई वस्तु को एक जासूस बनाने के लिए और आंतरिक कार्यों के लिए कॉल को मॉक करने के लिए है।
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
यहां चिंता का विषय यह है कि SUT के कार्यान्वयन को प्रभावी रूप से बदल दिया गया है और परीक्षणों को क्रियान्वयन के साथ जोड़कर रखना समस्याग्रस्त हो सकता है। क्या ये सच है? क्या आंतरिक विधि कॉल के इस कहर से बचने के लिए सबसे अच्छा अभ्यास है?
ध्यान दें कि हम एक एल्गोरिथ्म के कुछ हिस्सों के बारे में बात कर रहे हैं, इसलिए इसे कई वर्गों के लिए तोड़ना एक वांछित निर्णय नहीं हो सकता है।