आप एक मुहरबंद वर्ग का नकल कैसे करते हैं?

Mocking sealed classes can be quite a pain. I currently favor an Adapter pattern to handle this, but something about just keeps feels weird.

तो, सीलबंद कक्षाओं का नकल करने का सबसे अच्छा तरीका क्या है?

Java answers are more than welcome. In fact, I would anticipate that the Java community has been dealing with this longer and has a great deal to offer.

लेकिन यहां कुछ नेट राय हैं:

0
ro fr bn
जोड़ा लेखक cregox, स्रोत

10 उत्तर

क्या इंटरफ़ेस से एक सीलबंद क्लास को कार्यान्वित करने का कोई तरीका है ... और इसके बजाय इंटरफ़ेस का नकल करें?

मुझे कुछ ऐसा लगता है कि सीलबंद कक्षाएं पहले स्थान पर गलत हैं, लेकिन यह सिर्फ मुझे है :)

0
जोड़ा
मुझे लगता है कि मुहरबंद कक्षाएं बहुत अच्छी हैं ... समस्या परीक्षण कर रही है। यह बदबू आ रही है कि हमें .NET परियोजनाओं के परीक्षण में सीमाओं के कारण अपना पूरा डिज़ाइन बदलना होगा। कई मामलों में डीआई इस तथ्य को पाने के लिए बस एक तरीका है कि स्थिर वर्ग / विधियों का परीक्षण करना मुश्किल है।
जोड़ा लेखक Beep beep, स्रोत

अंगूठे का मेरा सामान्य नियम यह है कि जिन वस्तुओं को मुझे नकली करने की आवश्यकता है, उनमें भी एक आम इंटरफ़ेस होना चाहिए। मुझे लगता है कि यह सही डिजाइन-वार है और परीक्षणों को बहुत आसान बनाता है (और यदि आप टीडीडी करते हैं तो आमतौर पर आपको क्या मिलता है)। इसके बारे में अधिक Google परीक्षण ब्लॉग नवीनतम पोस्ट (बिंदु 9 देखें)।

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

0
जोड़ा
@ टायलर यहां काम करता है
जोड़ा लेखक abyx, स्रोत
@ ब्रायनवाट्स मैं इसके साथ दृढ़ता से असहमत हूं। कक्षा को सील करने से कोडर को कक्षा का उत्तराधिकारी करने का मौका मिलता है। वे इसे इस तरह से उपयोगी तरीके से विस्तारित कर सकते हैं जिस तरह से आपने पूर्ववत नहीं किया है। आपको किसी चीज को चीजों को खराब करने के बारे में चिंता करने की ज़रूरत नहीं है; यह (शायद) आपकी ज़िम्मेदारी नहीं है। मैं वास्तव में मुहरबंद कीवर्ड से दूर रहूंगा।
जोड़ा लेखक Jez, स्रोत
मैं तर्क दूंगा कि आपके पास कक्षा को सील करने के लिए नहीं एक अच्छा कारण होना चाहिए। कक्षा खोलने का मतलब है कि आपको इस बारे में सोचना होगा कि इसका उपयोग विरासतकर्ताओं द्वारा कैसे किया जाएगा, जो वर्ग (वर्चुअल, संरक्षित गुण या निजी सदस्य चर, इत्यादि) के सभी कोडों के बारे में निर्णय की बाढ़ उत्पन्न करता है। यह कठिन विरासत के लिए कक्षा को सही तरीके से डिजाइन करने के लिए। आप सिर्फ विस्तार के लिए कक्षा का विस्तार नहीं कर पाएंगे; व्युत्पन्न का मतलब मॉडल की समस्या के लिए कुछ विशिष्ट होना चाहिए। अन्यथा, इसके बजाए संरचना का पक्ष लें।
जोड़ा लेखक Bryan Watts, स्रोत
@ जेज़: अगर कक्षा को लिखते समय मैंने विस्तार नहीं माना था, तो इस पर भरोसा करने का क्या कारण है?
जोड़ा लेखक Bryan Watts, स्रोत
ब्रायन - तो आप फिर एक मुहरबंद वर्ग का नकल कैसे करेंगे? मैं सैद्धांतिक दृष्टिकोण से आपसे सहमत हूं, लेकिन यदि आप अपनी मुहरबंद कक्षा पर निर्भर कुछ लिखते हैं तो आपके परीक्षण मुहरबंद वर्ग पर भी निर्भर करते हैं।
जोड़ा लेखक Beep beep, स्रोत
@abyx: दुर्भाग्यवश, यह हमेशा डेवलपर की पसंद नहीं है कि कक्षा को सील कर दिया गया हो या नहीं। एएसपी.NET में System.Web.HttpServerUtility ले लो, उदाहरण के लिए ...
जोड़ा लेखक chiccodoro, स्रोत
लिंक मर चुका है
जोड़ा लेखक DevDave, स्रोत

यद्यपि यह वर्तमान में केवल बीटा रिलीज में उपलब्ध है, मुझे लगता है कि shim नया फ़्रेम फ्रेमवर्क की विशेषता है ( विजुअल स्टूडियो 11 बीटा रिलीज)।

शिम प्रकार उपयोगकर्ता परिभाषित प्रतिनिधि को किसी भी .NET विधि को रोकने के लिए एक तंत्र प्रदान करते हैं। शिम प्रकार नकली जनरेटर द्वारा कोड-जेनरेट किए जाते हैं, और वे नए विधि कार्यान्वयन को निर्दिष्ट करने के लिए, प्रतिनिधियों का उपयोग करते हैं, जिन्हें हम शिम प्रकार कहते हैं। हुड के तहत, शिम प्रकार कॉलबैक का उपयोग करते हैं जिन्हें विधि एमएसआईएल निकायों में रनटाइम पर इंजेक्शन दिया गया था।

निजी तौर पर मैं ड्रॉइंग कॉन्टेक्स्ट जैसे सीलबंद ढांचे वर्गों पर विधियों का नकल करने के लिए इसका उपयोग कर रहा था।

0
जोड़ा

मेरा मानना ​​है कि माइक्रोसॉफ्ट रिसर्च से मोल्स , आपको ऐसा करने की अनुमति देता है। मोल्स पेज से:

मोल्स किसी भी .NET को अलग करने के लिए उपयोग किया जा सकता है   विधि, गैर वर्चुअल / स्थैतिक सहित   मुहरबंद प्रकारों में विधियां।

UPDATE: there is a new framework called "Fakes" in the upcoming VS 11 release that is designed to replace Moles:

The Fakes Framework in Visual Studio 11 is the next generation of Moles & Stubs, and will eventually replace it. Fakes is different from Moles, however, so moving from Moles to Fakes will require some modifications to your code. A guide for this migration will be available at a later date.

Requirements: Visual Studio 11 Ultimate, .NET 4.5

0
जोड़ा

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

यह लंबे समय तक मेरी निर्भरताओं को स्विच करना भी आसान बनाता है।

0
जोड़ा

TypeMock के साथ समस्या यह है कि यह खराब डिजाइन बहाना है। अब, मुझे पता है कि यह अक्सर किसी और का खराब डिज़ाइन होता है जो इसे छुपा रहा है, लेकिन इसे आपकी विकास प्रक्रिया में अनुमति देने से आपके स्वयं के खराब डिज़ाइनों को अनुमति मिल सकती है।

मुझे लगता है कि यदि आप एक मॉकिंग फ्रेमवर्क का उपयोग करने जा रहे हैं, तो आपको पारंपरिक (जैसे मोक) का उपयोग करना चाहिए और अनावश्यक चीज़ के आस-पास एक अलगाव परत बनाना चाहिए, और इसके बजाय अलगाव परत का नकल करना चाहिए।

0
जोड़ा
मैं यहां ब्रैड से सहमत हूं। नकली वस्तु बनाना एक तात्पर्य है कि आप उस प्रकार के सार्वजनिक व्यवहार का परीक्षण कर रहे हैं। यही है, आप विशेष रूप से कह रहे हैं, "मुझे इस वस्तु के सार्वजनिक एपीआई को एक निश्चित तरीके से व्यवहार करने की आवश्यकता है।" हालांकि यह व्यवहार स्वतंत्र है, हालांकि एपीआई लागू किया गया है। इसका मतलब है कि आपके पास पहले से परिभाषित (हालांकि अंतर्निहित) अमूर्तता है जिसे एक निश्चित तरीके से व्यवहार करने की आवश्यकता है। एक स्थिर प्रकार प्रणाली में, यह एक अमूर्त प्रकार बनाकर स्पष्ट किया जाना चाहिए।
जोड़ा लेखक Sam Pearson, स्रोत
दृष्टि में सबकुछ पर इंटरफेस को थप्पड़ मारना सिर्फ इसलिए कि आपको अपने परीक्षण उपकरणों की कमियों की वजह से उनकी आवश्यकता है क्योंकि खराब डिजाइन नहीं है। वास्तव में, काफी विपरीत - यह सेन डिज़ाइन है जो डिज़ाइन के बारे में है, न कि आपके टूल्स के अनुरूप। मैं कसम खाता हूं, कभी-कभी मुझे लगता है कि टीडीडी जितना प्रायः व्यावहारिक रूप से अभ्यास किया जाता है उसे वास्तव में "उपकरण-संचालित डिजाइन" कहा जाना चाहिए। यह भी देखें weblogs.asp.net/r
जोड़ा लेखक Pavel Minaev, स्रोत
पावेल - क्या आपके पास TypeMock के अलावा कोई अन्य टूल है जो इस प्रकार के परीक्षण प्रदान कर सकता है? सैनी डिज़ाइनों के साथ निर्मित परीक्षण कक्षाएं (उदाहरण के लिए स्थैतिक तरीकों का उपयोग करना, कोड में नई कॉल, इंटरफेस को सीमित करना जहां कई कार्यान्वयन की आवश्यकता है, आदि) परीक्षण के लिए असंभव के बगल में होते हैं।
जोड़ा लेखक Beep beep, स्रोत

.NET के लिए, आप TypeMock जैसे कुछ का उपयोग कर सकते हैं, जो प्रोफाइलिंग API का उपयोग करता है और आपको कॉल में हुक करने की अनुमति देता है लगभग कुछ भी।

0
जोड़ा
कुछ लोग परीक्षण ढांचे के लिए $ 80 प्रति माह का भुगतान करना पसंद नहीं कर सकते हैं।
जोड़ा लेखक Matt Grande, स्रोत
मुझे लगता है कि मोल्स आपको सीलबंद कक्षाओं के साथ काम करने की अनुमति देता है - और यदि आपके पास एमएसडीएन सदस्यता है, तो यह मुफ़्त है।
जोड़ा लेखक Mathias, स्रोत
+1। सही उपकरण का प्रयोग करें। औजारों को आपको निर्देशित न करें कि आपको चीजों को कैसे करना चाहिए। एपीआई लोगों के लिए हैं, उपकरण के लिए नहीं - उन्हें इस तरह डिजाइन करें। डी और इंटरफेस और पूर्ण डिकूप्लिंग का उपयोग करें जहां यह समझ में आता है, न सिर्फ इसलिए कि आपको परीक्षण उपकरणों के लिए इसकी आवश्यकता होती है।
जोड़ा लेखक Pavel Minaev, स्रोत
AFAIK इन ढांचे के साथ मुख्य समस्याओं में से एक है जो सीलबंद कक्षाओं, सांख्यिकी, आदि का नकल कर सकते हैं प्रदर्शन है। व्यक्तिगत रूप से मैं एक इंटरफ़ेस बनाना पसंद करता हूं और अपने उत्पादन कोड में उपयोग करता हूं, जिसमें उत्पादन के दौरान इंजेक्शन वाली एक विरासत प्रॉक्सी ऑब्जेक्ट और परीक्षण के दौरान इंजेक्शन वाला नकली होता है।
जोड़ा लेखक Adam Ralph, स्रोत
एक विकल्प Telerik JustMock है। आप विरासत कोड का परीक्षण करने के लिए वाणिज्यिक संस्करण का उपयोग कर सकते हैं और इंटरफेस और निर्भरता इंजेक्शन लागू करने के बाद मुक्त संस्करण में स्थानांतरित कर सकते हैं।
जोड़ा लेखक kodefuguru, स्रोत
पावेल - समस्या यह है कि .NET में "दाएं" तरीके आमतौर पर 'परीक्षण के लिए टाइपमॉक का उपयोग करें' के पथ को नीचे ले जाता है। एक पथ के बाद जहां केवल एक परीक्षण उपकरण उपलब्ध है, वह भी अच्छा प्रतीत नहीं होता है।
जोड़ा लेखक Beep beep, स्रोत

मैं आम तौर पर मुहरबंद प्रकार के मॉकिंग की सुविधा के लिए एक इंटरफ़ेस और एडाप्टर / प्रॉक्सी क्लास बनाने का मार्ग लेता हूं। हालांकि, मैंने इंटरफ़ेस के निर्माण को छोड़ने और वर्चुअल विधियों के साथ प्रॉक्सी प्रकार को गैर-सील करने के साथ भी प्रयोग किया है। यह अच्छी तरह से काम करता है जब प्रॉक्सी वास्तव में एक प्राकृतिक आधार वर्ग है जो सीलबंद वर्ग के उपयोगकर्ताओं को घेरता है और उपयोगकर्ताओं का हिस्सा बनता है।

इस अनुकूलन की आवश्यकता वाले कोड से निपटने पर, मैं इंटरफ़ेस और प्रॉक्सी प्रकार बनाने के लिए एक ही क्रिया करने के थक गया था इसलिए मैंने कार्य को स्वचालित करने के लिए एक लाइब्रेरी लागू की।

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

For more information, please refer to this page.

0
जोड़ा

एक सीलबंद वर्ग का नकल करना पूरी तरह से उचित है क्योंकि कई ढांचे के वर्गों को बंद कर दिया जाता है।

मेरे मामले में मैं नेट की संदेश क्यूई क्लास का नकल करने की कोशिश कर रहा हूं ताकि मैं अपने सुंदर अपवाद हैंडलिंग तर्क को टीडीडी कर सकूं।

अगर किसी के पास "गैर-अतिसंवेदनशील सदस्य पर अमान्य सेटअप" के संबंध में मोक की त्रुटि को दूर करने के बारे में विचार हैं, तो कृपया मुझे बताएं।

कोड:

    [TestMethod]
    public void Test()
    {
        Queue messages = new Queue();
        Action sendDelegate = msg => messages.Enqueue(msg);
        Func receiveDelegate =
            (v1, v2) =>
            {
                throw new Exception("Test Exception to simulate a failed queue read.");
            };

        MessageQueue mockQueue = QueueMonitorHelper.MockQueue(sendDelegate, receiveDelegate).Object;
    }
    public static Mock MockQueue
                (Action sendDelegate, Func receiveDelegate)
    {
        Mock mockQueue = new Mock(MockBehavior.Strict);

        Expression> sendMock = (msmq) => msmq.Send(It.IsAny()); //message => messages.Enqueue(message);
        mockQueue.Setup(sendMock).Callback(sendDelegate);

        Expression> receiveMock = (msmq) => msmq.Receive(It.IsAny(), It.IsAny());
        mockQueue.Setup(receiveMock).Returns(receiveDelegate);

        return mockQueue;
    }
0
जोड़ा
मुझे एक समाधान मिला है और यहां पोस्ट किया गया है: dotnetmonkey.net/post/Hard-to -Moq.aspx
जोड़ा लेखक Adam Lenda, स्रोत

मैं हाल ही में इस समस्या में आया और वेब पढ़ने / खोजने के बाद, ऐसा लगता है कि उपरोक्त वर्णित किसी अन्य टूल का उपयोग करने के अलावा चारों ओर कोई आसान तरीका नहीं है। या चीजों को संभालने की क्रूड जैसा मैंने किया था:

  • कन्स्ट्रक्टर प्राप्त किए बिना सीलबंद कक्षा का उदाहरण बनाएं।
  • System.Runtime.Serialization.FormatterServices.GetUninitializedObject (instanceType);

  • प्रतिबिंब के माध्यम से अपनी गुणों / फ़ील्ड में मान असाइन करें

  • YourObject.GetType ()। GetProperty ("PropertyName")। SetValue (dto, newValue, null);
  • YourObject.GetType ()। GetField ("FieldName")। SetValue (dto, newValue);
0
जोड़ा
यह एकमात्र समाधान है जो नकली जैसे अतिरिक्त पुस्तकालयों को जोड़ने के बिना आंतरिक माइक्रोसॉफ्ट सामानों का मज़ाक उड़ाने के लिए समझ में आता है और काम करता है - धन्यवाद!
जोड़ा लेखक Ben, स्रोत
QAIndia
QAIndia
160 प्रतिभागियों की

QA India ! Unite Here we share job postings , prepare for interviews and share tips/techniques in QA. Please follow following guideline while sharing any job ... QA job # location : # title Company : Title : Requirement: Responsibility: Apply: