2009-06-17 12 views
8

इकाई परीक्षण उद्देश्यों के लिए मैं किसी भी निर्माता के साथ कक्षा के mock object लिखने की कोशिश कर रहा हूं।जावा में कोई रचनाकार नहीं होने के साथ कक्षा का विस्तार करना संभव है?

क्या यह जावा में भी संभव है, कक्षा केवल विस्तार योग्य नहीं है?

+2

प्रश्न यह मजाक किया जा सकता था, स्वीकार्य उत्तर दिए जाने पर इसे उपclassed नहीं किया जा सकता है, शायद आपको यह प्रश्न बदलना चाहिए यदि आपका मतलब क्या है? – Yishai

+0

मेरे प्रश्न स्पष्ट रूप से विस्तारशीलता के बारे में पूछते हैं। यह केवल इस विस्तारशीलता की इच्छा के कारण के रूप में मजाक कर रहा है। –

उत्तर

18

कोई भी रचनाकार वाले वर्ग में कोई अंतर्निहित सार्वजनिक नो-तर्क कन्स्ट्रक्टर नहीं है और हां, जब तक यह अंतिम नहीं है, यह उप-वर्गीकृत हो सकता है।

यदि कक्षा में केवल निजी निर्माता हैं तो नहीं, यह नहीं कर सकता है।

+0

प्रश्न में कक्षा में केवल निजी रचनाकार हैं, जिनमें कोई तर्क नहीं है, इसलिए मुझे लगता है कि मैं भाग्य से बाहर हूं। –

+0

ऐसा लगता है कि परीक्षण के मामले में वह वर्ग बहुत अनुकूल नहीं है। आपको वास्तव में प्रकारों को अवधारणाओं के बजाय इंटरफेस का उपयोग करना चाहिए ... –

+1

तो फिर आप एक सिंगलटन का परीक्षण कर रहे हैं? यह हमेशा बट में दर्द होने लगता है। –

2

यदि जावा क्लास में कोई परिभाषित कन्स्ट्रक्टर नहीं है तो आपके लिए कोई समस्या नहीं है। समस्याएं तब होंगी जब कक्षा में कोई भी रचनाकार परिभाषित होगा और उनमें से सभी आपके लिए (निजी) अदृश्य होंगे।

0

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

+0

लेकिन इससे आपको कक्षा का विस्तार करने में मदद नहीं मिलेगी। कंपाइलर आपको केवल निजी रचनाकारों के साथ कक्षा का विस्तार नहीं करने देगा। – Eddie

3

प्रश्न का उत्तर दिया गया है, लेकिन एक टिप्पणी जोड़ने के लिए। यह प्रायः प्रस्तावित करने का एक अच्छा समय है कि कोड कुछ हद तक टेस्ट करने योग्य लिखा जा सकता है।

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

हमें इसके बजाय डीई का उपयोग करने के लिए सिंगलेट्स का एक समूह फिर से लिखना पड़ा क्योंकि सिंगलेट्स को नकली करना बेहद मुश्किल है।

यह अच्छी तरह से नहीं जा सकता है, लेकिन अधिकांश पेशेवर दुकानों में टेस्टेबिलिटी के लिए कोडिंग का कुछ स्तर मानक है।

+0

जिस कक्षा में मैं नकली दिख रहा था वह एक ब्लैकबेरी वर्ग था जिसका मेरा कोई नियंत्रण नहीं था। –

+0

आप एक अच्छा मुद्दा बनाते हैं (माना जाता है कि कोई कोड बदल रहा है जो वे बदल सकते हैं), लेकिन शायद इसे किसी उत्तर के बजाय टिप्पणी के रूप में दर्ज किया जाना चाहिए था। – hotshot309

+0

मैं सहमत हूं लेकिन टिप्पणी में अनुच्छेदों में पाठ को अलग करने में असमर्थता अक्सर मुझे निराश करती है, लेकिन इन दिनों (तीन साल बाद) मुझे लगता है कि मैं एक्साक्लिटी करता हूं - जीना और सीखना। –

3

हां, आप ऑब्जेक्ट का मज़ाक उड़ा सकते हैं, हालांकि इसे उपclass करना संभव नहीं है (निश्चित रूप से कक्षा लोडर के साथ बहुत अंतरंग नहीं होने के बावजूद)। Here यह है कि आप इसे JMock के साथ कैसे करते हैं।

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

यदि आपके पास वास्तव में कक्षा के स्रोत कोड तक पहुंच है, तो आप एक आंतरिक कक्षा को कार्यान्वित कर सकते हैं जो आपको इसे विस्तारित करने की अनुमति देता है, हालांकि यदि आप ऐसा कर सकते हैं, तो आप केवल रचनाकारों में से एक पैकेज को निजी बना सकते हैं।

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

1

आप JMockit का उपयोग करके कक्षा, और उसके सभी रचनाकारों का नकल कर सकते हैं।

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

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

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