2011-01-05 10 views
7

मैं एक वर्ग है कि कुछ निजी क्षेत्रों initializes में एक विधि का परीक्षण इकाई के लिए कोशिश कर रहा हूँ:शून्य विधि का परीक्षण कैसे करें जो केवल निजी वर्ग सदस्य चर को संशोधित करता है?

public void init(Properties props) throws Exception { 

    this.language = props.getProperty(Constants.LANGUAGE,Constants.LANGUAGE_DEFAULT); 
    this.country = props.getProperty(Constants.COUNTRY,Constants.COUNTRY_DEFAULT); 

     try { 
      this.credits = Integer.valueOf(props.getProperty(Constants.CREDITS_OPTION_NAME, Constants.CREDITS_DEFAULT_VALUE)); 
     } catch (NumberFormatException e) { 
      throw new Exception("Invalid configuration: 'credits' does not contain a valid integer value.", e); 
     } 
     //rest of method removed for sake of simplicity 
    } 

मेरे दुविधा है कि मैं बात पर जोर देना भाषा, देश कि चाहते हैं और खेतों init बुला के बाद स्थापित किए गए हैं क्रेडिट है, हालांकि वे सार्वजनिक एक्सेसर विधियों के साथ निजी हैं। मुझे लगता है कि इसका परीक्षण करने के लिए दो समाधान हैं:

  1. निजी फ़ील्ड तक पहुंचने के लिए सार्वजनिक विधियां बनाएं, फिर इन विधि को इनिट विधि का परीक्षण करने के बाद कॉल करें।
  2. इकाई परीक्षण केवल इनिट विधि को कॉल करें, और मान लें कि सबकुछ ठीक से काम करता है, कोई अपवाद नहीं फेंक दिया गया है।

आपको इस विधि का परीक्षण करने का आदर्श तरीका क्या लगता है?

+0

क्या कोई कारण नहीं है कि कोई भी सेटर को कॉल करने वाले किसी अन्य परीक्षण को जोड़ने का सुझाव देता है, फिर "उसी फ़ील्ड में एक और तरीका जिसे इन फ़ील्ड को सेट करने की आवश्यकता है?" मैं टीडीडी के लिए काफी नया हूं और अपने काम में इस तरह के समाधान की ओर झुका रहा था, क्या इसमें कोई समस्या है? क्या यह अभी भी इकाई परीक्षण, या कुछ और, एकीकरण परीक्षण या कुछ की तरह है? जैसा कि यहां सुझाव दिया गया है: http://stackoverflow.com/questions/3193257/should-i-test-public-class-function-that-changes-only-internal-state-of-the-obje –

उत्तर

9

आप निजी क्षेत्रों के मूल्य प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। उदाहरण के लिए:

Field field = YourClass.class.getDeclaredField("language"); 
field.setAccessible(true); //override the access restriction of it being private 
field.get(yourObject); 

अगर वहाँ अपने classpath पर वसंत है, तो आप अपने ReflectionUtils/ReflectionTestUtils उपयोग कर सकते हैं।

कभी-कभी तर्क दिया जाता है कि निजी क्षेत्रों को सत्यापित नहीं किया जाना चाहिए, और केवल वस्तु का सार्वजनिक राज्य यूनिट-परीक्षण का बिंदु है। उस परिप्रेक्ष्य से एक गेटर, या इससे भी बेहतर खुलासा करना बेहतर हो सकता है - एक अपवाद फेंक दिया।

यदि फ़ील्ड सेट नहीं हैं तो ऑब्जेक्ट अमान्य स्थिति में है, तो अपवाद फेंक कर, यह अपनी वैधता को लागू करने के लिए ऑब्जेक्ट की जिम्मेदारी होनी चाहिए।

+0

धन्यवाद, में अंत में मैंने अपने init विधि से अपवाद फेंकने का फैसला किया यदि मान सही नहीं थे। –

1

क्या आपके जुनीट विधि को सीधे कॉल करते हैं? फिर प्रॉपर्टी ऑब्जेक्ट का संदर्भ वही है, आप भाषा और देश तक पहुंचने में सक्षम होना चाहिए, क्योंकि क्रेडिट आपके जुनीट में पुनर्मूल्यांकन करते हैं।

निजी तरीकों के लिए सार्वजनिक एक्सेसर भी एक अच्छा विकल्प है।

+0

अब यह वास्तव में परीक्षण के तहत कक्षा का परीक्षण नहीं करेगा .. –

+0

सार्वजनिक एक्सेसर विधियां काम करेगी, लेकिन फिर जब मैं दृश्यमान होने की आवश्यकता नहीं है तो कक्षा के बाहर से फ़ील्ड मानों का खुलासा कर रहा हूं। मैं इसे अधिक टेस्ट करने योग्य बनाने के लिए कोड को दोबारा करने के लिए हूं लेकिन यह इस स्थिति में "सही" प्रतीत नहीं होता है। –

4

मैं आम तौर पर परीक्षण के तहत कक्षा की आंतरिक संरचना पर निर्भर परीक्षणों से बचने की कोशिश करता हूं। मैं कुछ तरीकों का परीक्षण करके इसका परीक्षण करूंगा जो तब इन क्षेत्रों का उपयोग करता है।

आप सख्त TDD कर रहे हैं, तो आप नहीं यहां तक ​​कि उन क्षेत्रों जोड़ना चाहिए जब तक आप एक परीक्षण का मामला है कि वास्तव में उन्हें का लाभ :)

+0

दुर्भाग्य से मैं यूनिट परीक्षण विरासत कोड हूं, इसलिए मेरे द्वारा किए जा सकने वाले परिवर्तनों पर मुझे बहुत अधिक स्वतंत्रता नहीं है। –

+0

+1 "आपको तब तक उन फ़ील्ड को तब तक नहीं जोड़ना चाहिए जब तक आपके पास टेस्ट केस न हो" – Raedwald

9

मैं बात पर जोर देना चाहते हैं कि भाषा, देश और लगता है क्रेडिट फ़ील्ड इनिट

कुछ दर्शन: आप क्यों परवाह करते हैं कि वे सही तरीके से सेट हैं या नहीं? अगर जवाब है "तो वर्ग सही ढंग से व्यवहार करता है", तो आप परीक्षण कर सकते हैं कि उन्हें बाद में व्यवहार की उम्मीद के परीक्षण के द्वारा सहीता निर्धारित की गई है। यदि उन्हें गलत तरीके से सेट करना कोई प्रभाव नहीं पड़ता है तो वे अनावश्यक हैं और आपको उन्हें हटा देना चाहिए।

एक और पोस्टर ने निजी क्षेत्रों तक पहुंचने के लिए प्रतिबिंब का उपयोग करने का सुझाव दिया है। मैं इसके खिलाफ सलाह देता हूं; कुछ भी चिह्नित निजी वर्ग के कार्यान्वयन विस्तार होना चाहिए, और इसलिए सीधे परीक्षण नहीं किया जाना चाहिए। आपको इसके बजाय अपनी कक्षा के प्रकाशित एपीआई का परीक्षण करना चाहिए। इसके बाद आप कार्यान्वयन (निजी) विवरण बदलकर आसानी से इसे पुनः सक्रिय करने की आजादी रखते हैं।

+0

उसी फ़ील्ड में एक और तरीका है जिसे इन फ़ील्ड को सेट करने की आवश्यकता है, हालांकि इन फ़ील्ड पर निर्भर विधि कॉल को मजाक कर दिया गया है एक त्रुटि की रिपोर्ट नहीं होगी। इस मामले में खेतों को पकड़ना बेहतर है क्योंकि इन्हें इनिट विधि में सेट किया जा रहा है? –

+0

यदि कोई त्रुटि रिपोर्ट नहीं की जाएगी, तो फ़ील्ड का कोई प्रभाव नहीं पड़ता है, इसलिए मैं उन्हें हटाने की अनुशंसा करता हूं, या फिर, जब तक आप उस विधि पर काम नहीं करते तब तक उन्हें जोड़ना स्थगित कर देते हैं। – Raedwald

+0

सामान्य परिस्थितियों में एक त्रुटि होगी सूचना दी, लेकिन एक परीक्षण स्थिति के तहत उन लोगों बाहरी निर्भरता मज़ाक उड़ाया जाने की जरूरत है - इसलिए कोई त्रुटि नकली से फेंक दिया होगा - लेकिन खेतों वास्तव में आवश्यक हैं। फ़ील्ड मानों को केवल उस विधि में सेट करना है जिसका उपयोग वे करते हैं, लेकिन वे मान (प्रोप) से निर्धारित मूल्य केवल इनिट विधि के लिए उपलब्ध हैं। –

1

व्यक्तिगत रूप से मैं केवल सार्वजनिक तरीकों की जांच करता हूं। कभी-कभी आपको आंतरिक जांचना पड़ता है, लेकिन यह दुर्लभ है।

बीटीडब्ल्यू: सार्वजनिक गेटर्स का एक विकल्प एक ही पैकेज में इकाई परीक्षण करना और पैकेज स्थानीय गेटर्स प्रदान करना है।

संबंधित मुद्दे

 संबंधित मुद्दे