2008-09-18 10 views
6

क्या जावा में जेएमॉक का उपयोग करके ऑब्जेक्ट निर्माण का मजाक करने का कोई तरीका है?ऑब्जेक्ट निर्माण का नकल कैसे करें?

उदाहरण के लिए

, अगर मैं इस तरह के रूप में एक विधि है:

public Object createObject(String objectType) { 
    if(objectType.equals("Integer") { 
     return new Integer(); 
    } else if (objectType.equals("String") { 
     return new String(); 
    } 
} 

... वहाँ एक परीक्षा पद्धति में वस्तु के निर्माण की उम्मीद बाहर उपहास करने के लिए एक तरीका है?

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

तो बजाय:

assertTrue(a.createObject() instanceof Integer); 

मैं कुछ निर्माता की एक उम्मीद हो सकता था बुलाया जा रहा है। बस इसे थोड़ा क्लीनर बनाने के लिए, और वास्तव में एक और अधिक पठनीय तरीके से परीक्षण किया जा रहा है व्यक्त करें।

कृपया सरल उदाहरण बहाना, वास्तविक समस्या मैं पर काम कर रहा हूँ थोड़ा और अधिक जटिल है, लेकिन उम्मीद होने इसे सरल होगा।


में थोड़ा और अधिक पृष्ठभूमि के लिए:

मैं एक साधारण कारखाने विधि है, जो आवरण वस्तुओं बनाता है। लिपटे ऑब्जेक्ट्स को ऐसे पैरामीटर की आवश्यकता हो सकती है जो टेस्ट क्लास (यह पूर्व-मौजूदा कोड) में प्राप्त करना मुश्किल हो, इसलिए उन्हें बनाना मुश्किल है।

शायद जो मैं वास्तव में देख रहा हूं उसके करीब है: क्या एक पूरी कक्षा का नकल करने का कोई तरीका है (CGLib का उपयोग करके) एक में झुकाव के लिए हर विधि को निर्दिष्ट किए बिना, झुका हुआ है?

तो नकली एक निर्माता में लिपटे की जा रही है, तो जाहिर है तरीकों उस पर कहा जा सकता है, गतिशील रूप से प्रत्येक विधि बाहर मजाक की JMock करने में सक्षम है? कि के रूप में बहुत जटिल होगा

मेरा अनुमान है, नहीं है। लेकिन जानते हुए भी मैं गलत पेड़ भौंकने कर रहा हूँ मूल्यवान भी :-)

+0

में मेरा उत्तर तुम हो कारखाने यह प्रत्येक प्रकार यह निर्माण हो सकता है (एक पूर्णांक कारखाने, एक स्ट्रिंग कारखाना, आदि) लेकिन, तुम सही हो के लिए खुद कारखानों है हो सकता था, जो ज़रूरत से ज़्यादा जटिल की ओर खड़ा है । आप जोर दे रहे हैं कि परीक्षा का शायद सबसे अच्छा तरीका है। – sblundy

उत्तर

5

एकमात्र चीज जिसे मैं सोच सकता हूं वह है कि फैक्ट्री ऑब्जेक्ट पर निर्माण विधि है, जिसे आप नकली करना चाहते हैं।

लेकिन एक निर्माता कॉल मजाक के मामले में, नहीं। मॉक ऑब्जेक्ट ऑब्जेक्ट के अस्तित्व का अनुमान लगाते हैं, जबकि एक कन्स्ट्रक्टर का मानना ​​है कि ऑब्जेक्ट मौजूद नहीं है। कम से कम जावा में जहां आवंटन और प्रारंभिकरण एक साथ होता है।

-1

मुझे आशा है कि वहाँ कोई नहीं है। मोक्स इंटरफेस का मज़ाक उड़ाते हैं, जिनके पास कोई कन्स्ट्रक्टर नहीं है ... बस विधियां।

कुछ यहाँ का परीक्षण करने के लिए अपने दृष्टिकोण में गलत हो रहा है। किसी भी कारण से आपको उस स्पष्ट रचनाकारों का परीक्षण करने की आवश्यकता क्यों है?
लौटे वस्तु के प्रकार पर जोर दिया जाना परीक्षण कारखाने कार्यान्वयन के लिए ठीक लग रहा है। ब्लैकबॉक्स के रूप में createObject का इलाज करें .. यह जांचें कि यह क्या लौटाता है लेकिन माइक्रोमैनेज नहीं करता है कि यह कैसे करता है। कोई भी इसे पसंद नहीं करता है :)

अपडेट पर अपडेट करें: ओच! हताश समय के लिए निराशाजनक उपाय आह? मुझे आश्चर्य होगा अगर जेमॉक इसे अनुमति देता है ... जैसा कि मैंने कहा था कि यह इंटरफेस पर काम करता है .. ठोस प्रकार नहीं। तो

  • या तो कोशिश करते हैं और परीक्षण दोहन के तहत उन परेशान इनपुट वस्तुओं 'instantiable' हो रही है पर कुछ प्रयास व्यय। अपने दृष्टिकोण में नीचे जाओ।
  • यदि यह अक्षम है, मैन्युअल रूप से ब्रेकपॉइंट्स के साथ इसका परीक्षण करें (मुझे पता है कि यह बेकार है)। फिर स्रोत फ़ाइल में एक दृश्य क्षेत्र में "अपने जोखिम पर इसे स्पर्श करें" टिप्पणी चिपकाएं और आगे बढ़ें। एक और दिन लड़ो।
+0

यह एक साधारण कारखाना विधि है। समस्या यह है कि फैक्ट्री अन्य वस्तुओं के लिए रैपर बनाती है (उन्हें निर्माण के दौरान पैरामीटर के रूप में ले जाती है) और उनको वापस कर देती है। मैं परीक्षण करने में सक्षम होना चाहता हूं कि कन्स्ट्रक्टर को लपेटने या ऑब्जेक्ट को तुरंत चालू करने के बजाए कन्स्ट्रक्टर को बुलाया जा रहा है। – Grundlefleck

+0

इसके साथ समस्या यह है कि फैक्ट्री विधि एक ऑब्जेक्ट लेती है जो अलगाव में फिर से बनाना मुश्किल है - इसे फिर से पूछने के लिए रीफैक्टरिंग की अनुमति देने के लिए। हालांकि ... उनको मजाक कर शायद जवाब है ... – Grundlefleck

0

आप Dependency Injection से परिचित हैं?

यदि नहीं, तो आप ceartanly कि अवधारणा के बारे में सीखने से लाभ होगा। मुझे लगता है कि मार्टिन फाउलर द्वारा अच्छा पुराना Inversion of Control Containers and the Dependency Injection pattern एक अच्छा परिचय के रूप में कार्य करेगा।

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

0

निर्भरता इंजेक्शन या नियंत्रण में उलटा।

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

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

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

1

ओह, मुझे लगता है कि मैं गलत सवाल पूछने का दोषी हूँ।

public Wrapper wrapObject(Object toWrap) { 
    if(toWrap instanceof ClassA) { 
     return new Wrapper((ClassA) toWrap); 
    } else if (toWrap instanceof ClassB) { 
     return new Wrapper((ClassB) toWrap); 
    } // etc 

    else { 
     return null; 
    } 
} 

मैं कैसे पता लगाने के लिए प्रश्न पूछ रहा है, तो "नया ClassAWrapper()" कहा जाता था क्योंकि वस्तु toWrap एक में प्राप्त करने के लिए मुश्किल था:

सरल कारखाने मैं परीक्षण करने के लिए कोशिश कर रहा था की तरह कुछ देखा पृथक परीक्षण और रैपर (अगर इसे भी कहा जा सकता है) अजीब तरह का है क्योंकि यह अलग-अलग वस्तुओं को लपेटने के लिए एक ही कक्षा का उपयोग करता है, केवल विभिन्न रचनाकारों का उपयोग करता है [1]। मुझे संदेह है कि अगर मैंने सवाल थोड़ा बेहतर पूछा था, तो मुझे तुरंत जवाब मिल गया होगा:

"आपको विभिन्न परीक्षण विधियों में परीक्षण करने वाले उदाहरणों से मेल खाने के लिए ऑब्जेक्ट टूव्रैप करना चाहिए, और परिणामी रैपर का निरीक्षण करना चाहिए सही प्रकार को खोजने के लिए ऑब्जेक्ट वापस आ गया है ... और आशा है कि आप भाग्यशाली हैं कि आपको अलग-अलग उदाहरण बनाने के लिए दुनिया को नकल करने की ज़रूरत नहीं है ;-) "

अब मेरे पास ठीक है तत्काल समस्या, धन्यवाद!

[1] के इस पुनर्संशोधित जाना चाहिए कि क्या सवाल खोलने :-)

4

JMockit मेरे वर्तमान समस्या के दायरे से बाहर अच्छी तरह से है यह कर सकते हैं।

देखें https://stackoverflow.com/questions/22697#93675

+1

हाँ! जेमॉकिट नियम! http://stackoverflow.com/questions/190597/how-to-go-about-mocking-a-class-with-final-methods – Epaga

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