2008-09-01 23 views
14

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

मैं जावा में जवाब जानना चाहता हूं, लेकिन यदि कोई समाधान है जो भाषाओं को पार करता है तो मैं इसे जानना चाहता हूं।

संख्या 2. उत्तर में, दूसरे उत्तर की तरह किया जाएगा? यदि ऐसा है तो मैं दूसरे उत्तर को भी स्वीकार करूँगा और अपने प्रश्न को दोबारा एक कारखाने को संबोधित करने के लिए कहूंगा जहां एक इंटरफ़ेस वापस आ गया है और आपको कोई संकेत नहीं है कि किस प्रकार की ठोस कक्षा इंटरफ़ेस को कार्यान्वित करती है, और जिस मामले में आप जानते हैं कि ठोस वर्ग क्या था उपयोग किया गया।

उत्तर

16

जब से मैं कैसे अपने कारखाने विधि की तरह दिखता है पता नहीं है, सब मैं अभी सलाह दे सकते हैं करने के लिए

  1. चेक है देखने के लिए वस्तु सही ठोस कार्यान्वयन आप देख रहे थे है:

    IMyInterface fromFactory = factory.create(...); 
    Assert.assertTrue(fromFactory instanceof MyInterfaceImpl1); 
    
  2. आप यह जांच सकते हैं कि कारखाने वैध आवृत्ति चर के साथ ठोस उदाहरण स्थापित करता है या नहीं।

0
if (myNewObject instanceof CorrectClass) 
{ 
    /* pass test */ 
} 

अद्यतन:

क्यों यह नीचे में चिह्नित कर ली

पता नहीं है, इसलिए मैं इसे थोड़ा विस्तार करेंगे ...

public void doTest() 
{ 
    MyInterface inst = MyFactory.createAppropriateObject(); 
    if (! inst instanceof ExpectedConcreteClass) 
    { 
     /* FAIL */ 
    } 
} 
+4

इसे चिह्नित किया गया था 'कारण आपको परीक्षण के बजाय दावा का उपयोग करना चाहिए ... – Nicolas

0

@ CEM-catikkas मुझे लगता है कि getClass()। GetName() मानों की तुलना करना अधिक सही होगा। इस मामले में MyInterfaceImpl1 वर्ग उप-वर्गीकृत है, आपका परीक्षण टूटा जा सकता है, क्योंकि उप-वर्ग MyInterfaceImpl1 का उदाहरण है। मैं इस प्रकार पुनर्लेखन होगा:

IMyInterface fromFactory = factory.create(...); 
Assert.assertEquals(fromFactory.getClass().getName(), MyInterfaceImpl1.class.getName()); 

आपको लगता है इस में किसी तरह विफल हो सकता है (मैं कल्पना नहीं कर सकते हैं), दो सत्यापन करते हैं।

+0

मैं सहमत हूं, लेकिन मुझे नहीं लगता कि कक्षा के नामों की समानता की जांच करना अनावश्यक है। बस कक्षाओं की जांच करना काफी अच्छा होना चाहिए। –

+1

क्लास ऑब्जेक्ट्स की तुलना सीधे क्लास ऑब्जेक्ट की तुलना करने के बजाय क्लास से एक विधि बराबर मान क्यों लौटाएगी? – jdmichal

20

तुम क्या करने कोशिश कर रहे हैं इकाई परीक्षण

आप परीक्षण किया जाए या नहीं लौटे वस्तुओं विशिष्ट ठोस वर्ग के उदाहरण हैं, तो आप इकाई परीक्षण नहीं कर रहे हैं नहीं है। आप एकीकरण परीक्षण कर रहे हैं। जबकि एकीकरण परीक्षण महत्वपूर्ण है, यह वही बात नहीं है।

यूनिट परीक्षण में, आपको केवल ऑब्जेक्ट का परीक्षण करने की आवश्यकता है। यदि आप लौटे अमूर्त वस्तुओं के ठोस प्रकार पर जोर देते हैं, तो आप लौटे ऑब्जेक्ट के कार्यान्वयन पर परीक्षण कर रहे हैं। में वस्तुओं पर

यूनिट परीक्षण सामान्य

इकाई परीक्षण, चार बातें कर रहे हैं, तो आपको यह स्पष्ट करना चाहते हैं: खोजों की

  1. वापसी मान (गैर शून्य विधि) कर रहे हैं कि आप उन्हें क्या करने की उम्मीद हो।
  2. आदेशों के दुष्प्रभाव (शून्य विधियों) ऑब्जेक्ट को स्वयं संशोधित करते हैं जैसा कि आप उन्हें उम्मीद करते हैं।
  3. अन्य वस्तुओं को भेजने के लिए आदेश प्राप्त होते हैं (यह आम तौर पर मोजे का उपयोग करके किया जाता है)।

इसके अलावा, आप केवल एक ऑब्जेक्ट उदाहरण, यानी सार्वजनिक इंटरफ़ेस से क्या देखा जा सकता है इसका परीक्षण करना चाहते हैं। अन्यथा, आप अपने आप को कार्यान्वयन विवरण के एक विशिष्ट सेट से बांधते हैं। जब आप विवरण बदलते हैं तो आपको अपने परीक्षणों को बदलने की आवश्यकता होगी।

यूनिट टेस्टिंग कारखानों कारखानों पर

इकाई परीक्षण वास्तव में नीरस है, क्योंकि आप प्रश्नों की लौटे वस्तुओं के व्यवहार में कोई दिलचस्पी नहीं कर रहे हैं। वह व्यवहार (आशा है कि) कहीं भी परीक्षण किया गया है, अनुमानित है कि यूनिट परीक्षण जो स्वयं ऑब्जेक्ट करता है। आप केवल वास्तव में रुचि रखते हैं कि लौटे ऑब्जेक्ट में सही टाइप टाइप करें, जो आपके प्रोग्राम को संकलित करते समय गारंटीकृत है।

कारखाने समय के साथ नहीं बदलते हैं (क्योंकि तब वे "बिल्डर्स" होंगे, जो एक और पैटर्न है), परीक्षण करने के लिए कोई आदेश नहीं है।

कारखाने वस्तुओं को तत्काल करने के लिए जिम्मेदार हैं, इसलिए उन्हें अन्य कारखानों पर उनके लिए ऐसा करने पर निर्भर नहीं होना चाहिए। वे एक बिल्डर पर निर्भर हो सकते हैं, लेकिन फिर भी, हमें बिल्डर की शुद्धता का परीक्षण नहीं करना चाहिए, केवल बिल्डर को संदेश प्राप्त होता है या नहीं।

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

सारांश

  1. व्यवहार है और न ही वापस आ वस्तुओं के कार्यान्वयन विवरण का परीक्षण नहीं! ऑब्जेक्ट इंस्टेंस के कार्यान्वयन के लिए आपकी फैक्ट्री ज़िम्मेदार नहीं है!
  2. परीक्षण करें कि निर्भरता पर भेजे गए आदेश प्राप्त किए गए हैं या नहीं।

यही है। यदि कोई निर्भरता नहीं है, तो परीक्षण करने के लिए कुछ भी नहीं है। शायद यह कहने के लिए कि लौटाया गया ऑब्जेक्ट null संदर्भ नहीं है।

एकीकरण परीक्षण कारखानों

आप एक आवश्यकता है कि लौटे सार ऑब्जेक्ट प्रकार एक विशिष्ट ठोस प्रकार का एक उदाहरण है, तो इस एकीकरण परीक्षण के अंतर्गत आती है।

अन्य लोगों ने पहले ही उत्तर दिया है कि instanceof ऑपरेटर का उपयोग करके इसे कैसे किया जाए।

+0

इसके अलावा, यहां सैंडी मेटज़ द्वारा यूनिट परीक्षण पर एक अच्छी बात है: https://www.youtube.com/watch?v=URSWYvyc42M – Undreren

+0

फ़ैक्टरी द्वारा निर्मित ऑब्जेक्ट के लिए "अन्य ऑब्जेक्ट्स को भेजें आदेश" प्राप्त करने के लिए इकाई परीक्षण कैसे करें अपने आप? मान लें कि कारखाना 'नया कुछ ऑब्जेक्ट (कुछ निर्भरता)' देता है।यह वास्तव में तर्क का एक टुकड़ा है और यह मज़ेदार कन्स्ट्रक्टर के रूप में इतना टेस्टेबल नहीं है - यहां तक ​​कि यदि कुछ परीक्षण ढांचे के साथ भी संभव है - बल्कि "नहीं" है। – topr

+0

@topr तर्क के उस टुकड़े को लौटे वर्ग के अपने परीक्षणों पर परीक्षण किया जाना चाहिए, कारखाने के माध्यम से नहीं। – Undreren

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