मैं I1
से ILogger
इस तरह कार्यान्वित करने के लिए एडॉप्टर है:बिना किसी कोड के एडाप्टर के लिए जुनीट कैसे लिखें?
class BAdapter() implements I1
{
void logA() { // nothing }
void logB() { new BLogger().log() }
void logC() { // nothing }
}
मैं JUnit परीक्षण लिखने के लिए चाहते हैं, कि कार्यक्षमता को सत्यापित, लेकिन मैं, यह थोड़ा समस्यापूर्ण लगी के बाद से मैं अपने नकली वस्तु के बजाय इंजेक्षन नहीं कर सकते BLogger
का, या वापसी मूल्य सत्यापित करें। मुझे कई संभावित समाधान मिले, लेकिन मुझे यकीन नहीं है, जो सबसे अच्छा है।
केस एक: BAdapter
वर्ग के लिए void setLogger(Logger l)
जोड़ें।
class BAdapter() implements I1
{
private Logger logger = new BLogger();
public void logB() { logger.log() }
public void setLogger(Logger l) { logger = l }
.. //rest of methods
}
विपक्ष: क्यों सेटर जोड़ने के लिए जिसका उपयोग कभी भी "असली", गैर-परीक्षण कोड में नहीं किया जाता है?
केस दो: जोड़ें संरक्षित कारखाने विधि और परीक्षण पैकेज में sublcass BAdapter
।
class BAdapter() implements I1
{
public void logB() { createLogger().log() }
protected Logger createLogger() { retrun new BLogger() }
.. //rest of methods
}
class BAdapterForTesting extends BAdapter()
{
protected Logger createLogger() { retrun new MockBLogger() }
}
विपक्ष: मुझे यकीन नहीं है, अगर यह साफ और सुरुचिपूर्ण समाधान है, लेकिन मुझे यहां बहुत अधिक विपक्ष नहीं दिख रहा है।
केस तीन: सार फैक्टरी पैटर्न का उपयोग करें।
class BAdapter() implements I1
{
public void logB() { AbstractFactory.getFactory().getBLogger().log() }
.. //rest of methods
}
और कहीं परीक्षणों में:
AbstractFactory.setFactory(new MockLoggersFactory())
विपक्ष: यह बहुत जटिल है, है ना?
केस चार: रिटर्न बूलियन, उदाहरण के लिए, जब लॉगिंग किया गया था। जैसे
class BAdapter() implements I1
{
Boolean logA() { return false; }
Boolean logB() { return new BLogger().log() }
Boolean logC() { return false; }
}
विपक्ष: यह एक प्रकार का घाटा है। कुछ मूल्य वापस क्यों करें, जब किसी को इसे "वास्तविक", गैर परीक्षण कोड में क्यों चाहिए?
बेहतर समाधान? क्या कुछ बेहतर है?
मुझे एक्शन बुक में जुनीट में समान दृष्टिकोण मिला। परीक्षण कोड आपके कोड का क्लाइंट किसी अन्य के रूप में है, इसलिए यूनिट परीक्षण आवश्यकताओं के अनुरूप कोड को पुन: कारक या अपडेट करना अच्छा होता है। –