2012-05-17 4 views
16

अद्यतनस्टेटिक वर्ग/विधि/इकाई परीक्षण में संपत्ति, इसे रोकने या नहीं

एक स्थिर वर्ग/विधि/संपत्ति, एक इकाई परीक्षण विकास के वातावरण में इस्तेमाल किया जाना चाहिए यह देखते हुए कि यह परीक्षण करने के लिए कोई रास्ता नहीं है एक रैपर शुरू किए बिना जो फिर से टेस्टेबल नहीं है?

एक और परिदृश्य यह है कि जब स्थिर सदस्यों का उपयोग यूनिट परीक्षण लक्ष्य के भीतर किया जाता है, तो स्थिर मेमबर को मजाक नहीं किया जा सकता है। इस प्रकार, यूनिट परीक्षण लक्ष्य का परीक्षण होने पर आपको स्थैतिक मीम्बर्स का परीक्षण करना होगा। जब स्थिर सदस्य गणना करता है तो आप इसे अलग करना चाहते हैं।

उत्तर

32

परीक्षण स्थिर विधि किसी भी अन्य विधि का परीक्षण कर से अलग नहीं है एक और परीक्षण किया मॉड्यूल के अंदर एक निर्भरता के रूप में स्थिर विधि कोई समस्या को जन्म देती है (।। जैसा कि इसका उल्लेख किया गया है - आप इसे मुक्त टूल के साथ नकल नहीं कर सकते हैं)। लेकिन यदि स्थिर विधि स्वयं इकाई परीक्षण है तो आप आसानी से treat it as working, reliable component कर सकते हैं।

कुल मिलाकर, कुछ भी गलत नहीं है (जैसा कि, यह बाधित नहीं होता है यूनिट परीक्षण/टीडीडी) स्थिर विधियों के साथ:

  • यह आसान है, इनपुट-आउटपुट विधि (के सभी प्रकार "की गणना इस देखते हुए कि")
  • यह विश्वसनीय है, हमारा मतलब यह है कि यह या तो है इकाई आप द्वारा परीक्षण द्वारा या आप विश्वसनीय पर विचार 3 पार्टी स्रोत से आता है (जैसे। Math.Floor विश्वसनीय माना जा सकता है - इसका उपयोग करके नहीं बढ़ाया जाना चाहिए "देखो, यह स्थिर है!" चेतावनी; कोई मान सकता है कि माइक्रोसॉफ्ट इसका काम करता है)

जब स्थिर तरीके समस्याएं पैदा होंगी और इससे बचा जाना चाहिए?मूल रूप से केवल जब वे/के साथ बातचीत में कुछ कर आप नियंत्रित कर सकते हैं (या नकली):

  • अंदर से बुलाया
  • अन्य (संभवतः अधिक जटिल) स्थिर तरीकों फाइल सिस्टम, डेटाबेस, नेटवर्क निर्भरता के सभी प्रकार के
  • काफी कुछ भी अपने मजाक ढांचे नियमित शर्तों
  • पर के साथ सौदा नहीं कर सकते

संपादित करें:दो उदाहरण पर जब स्थिर विधि मेकअप इकाई परीक्षण कठिन

public int ExtractSumFromReport(string reportPath) 
{ 
    var reportFile = File.ReadAllText(reportPath); 
    // ... 
} 

कैसे आप File.ReadAllText के साथ सौदा करते होंगे? यह स्पष्ट रूप से फ़ाइल सामग्री को पुनर्प्राप्त करने के लिए फ़ाइल सिस्टम पर जाएगा, जो यूनिट परीक्षण के दौरान प्रमुख नो-नो है। यह बाह्य निर्भरता के साथ स्थैतिक विधि का उदाहरण है। इससे बचने के लिए, आप आम तौर पर फाइल सिस्टम एपीआई के आसपास रैपर बनाते हैं या बस इसे निर्भरता/प्रतिनिधि के रूप में इंजेक्ट करते हैं।

public void SaveUser(User user) 
{ 
    var session = SessionFactory.CreateSession(); 
    // ... 
} 

इस बारे में क्या? सत्र गैर-तुच्छ निर्भरता है। निश्चित रूप से, यह ISession के रूप में आ सकता है, लेकिन नकली वापसी के लिए SessionFactory को कैसे बल दें? हम नहीं कर सकते और हम सत्र ऑब्जेक्ट को तोड़ने में आसान नहीं बना सकते हैं।

ऊपर तरह के मामलों में, यह स्थिर तरीकों को पूरी तरह से बचने के लिए सबसे अच्छा है।

+1

के लिए उपलब्ध होता है जब स्थिर विधि गणना करता है, और आप इसका नकल नहीं कर सकते हैं? क्या इसे उदाहरण विधि बनाने की आवश्यकता है? – Pingpong

+2

@ पिंगपोंग: क्या आप थोड़ा विस्तार कर सकते हैं? 'Math.Floor' गणना करता है - क्या हम इसे नकली करते हैं? नहीं, क्योंकि हम जानते हैं कि 'Math.Floor (2.5)' वापस आ जाएगा 2. जब इनपुट-आउटपुट ** निर्धारित करने में आसान ** ** आपको कुछ भी नकल करने की आवश्यकता नहीं है (या उदाहरण का उपयोग करें)। पूरी * स्थिर विधि परीक्षण को कठिन बनाता है * जब वे गैर-तुच्छ निर्भरता प्रदान करते हैं या साइड इफेक्ट्स होते हैं तो वे परिस्थितियों से आते हैं। मेरा संपादन देखें। –

+0

स्थैतिक विधि के बारे में क्या एक कस्टम विधि है जो लंबी प्रक्रिया कैलक्यूशन करती है? – Pingpong

2

आप स्थिर तरीकों/गुणों का नकल नहीं कर सकते हैं। इसलिए, जब आपका classAclassB के कुछ स्थिर सदस्य का उपयोग करता है तो आप अलगाव में classA का परीक्षण नहीं कर सकते हैं।

अद्यतन: मुझे कुछ स्थैतिक वर्ग को ऑब्जेक्ट में लपेटने की कोई समस्या नहीं दिख रही है। इसमें बहुत समय नहीं लगता है, लेकिन यह आपको अपने सिस्टम में युग्मन को कम करने की अनुमति देता है।

4

स्टेटिक विधियां कैन इकाई परीक्षण किया जा सकता है। वे मज़ाक उड़ाया नहीं किया जा सकता (आम तौर पर, कुछ चौखटे Moles तरह यह करने के लिए देखते हैं

+0

लेकिन इस साधारण मामलों के लिए overkill है। मोल्स बिल्ड प्रक्रिया में एकीकृत होता है और केवल .net – undefined

0

तकनीकी रूप से आप PowerMock के साथ जावा में स्थिर विधि का नकल कर सकते हैं, लेकिन यदि आपको ऐसा करने की आवश्यकता है तो मैं गंभीरता से आपके कोड को पुनः प्रतिक्रिया देने की अनुशंसा करता हूं। मुझे लगता है कि स्थैतिक तरीकों को हमेशा private होना चाहिए और केवल आंतरिक उद्देश्यों के लिए परिभाषित कक्षाओं के भीतर ही उपयोग किया जाना चाहिए। मैं a code smell के रूप में सार्वजनिक रूप से खुला स्थिर विधि पर विचार करता हूं।

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