2009-03-09 5 views
5

मैं एक .NET लड़का हूँ - और मैं मुख्य रूप से सी # में कोड।जावा में "स्थैतिक प्रतिबिंब" कैसे काम करता है? (उदा। मॉकिटो या easymock में)

सी # 3.0 के बाद से, हम static reflection का उपयोग करने के लिए लैम्ब्डा अभिव्यक्तियों और अभिव्यक्ति पेड़ों का लाभ उठा सकते हैं। ,

string methodName = GetMethodName(o => o.DoSomething()); 
Console.WriteLine(methodName); // displays "DoSomething" 

अब, जब मैं जावा दुनिया में Mockito नमूने (या EasyMock वाले) को देखो मैं: उदाहरण के लिए, यह निम्नलिखित स्निपेट में GetMethodName लागू करने के लिए विधि पैरामीटर में पारित के नाम वापस जाने के लिए संभव है देखें:

LinkedList mockedList = mock(LinkedList.class); 
when(mockedList.get(0)).thenReturn("first"); 

यह कैसे काम करता है?

when विधि कैसे काम करता है? यह mockedList.get(0) को के रूप में 0 पैरामीटर के रूप में पारित विधि के साथ एक कॉल के रूप में और मूल्य के रूप में नहीं बताता है?

उत्तर

5

मॉकिंग लाइब्रेरी आम तौर पर अभिव्यक्ति पेड़ों के साथ काम नहीं करते हैं। वे एक प्रकार का निर्माण करते हैं जो उपयुक्त इंटरफ़ेस लागू करता है और उन्हें रिकॉर्ड करके या उन्हें सत्यापित करके और प्रीप्रोग्राम किए गए प्रतिक्रियाओं को वापस कर विधि कॉल का जवाब देता है। यह आम तौर पर प्रॉक्सी के साथ किया जाता है (उदा। RealProxy जावा में, Proxy जावा में) या गतिशील कोड पीढ़ी के साथ।

EasyMock के मामले में, यह Proxy (इंटरफेस के लिए, वैसे भी) का उपयोग करता है, जैसा कि आप स्रोत कोड में देख सकते हैं: org.easymock.internal.JavaProxyFactory देखें।

+0

प्रॉक्सी। असली कोडिंग फ्रेमवर्क अपनी कोड पीढ़ी के लिए। –

+0

.NET में, जोरदार टाइपिंग मॉकिंग फ्रेमवर्क अभिव्यक्ति पेड़ (सीएफ। मोक और राइनो मोक्स) और वास्तव में गतिशील प्रॉक्सी का उपयोग करते हैं। लेकिन यहां यह अभी भी अस्पष्ट है कि कैसे (प्रॉक्सी के साथ भी) आप सुरक्षित रूप से नकली सेट कर सकते हैं। क्या होगा यदि मैं टाइप करता हूं "कब (mockedList.get (0) + mockedList.get (2))। फिर वापसी (42)"? –

+0

अभिव्यक्ति के पेड़ों से पहले राइनो मोक्स लंबे समय से अस्तित्व में थे। यह कुछ मामलों में अभिव्यक्ति पेड़ * अब * का उपयोग कर सकता है, लेकिन यह हमेशा * ऐसा नहीं करता है। (यह अभी भी .NET 2.0 में काम करता है।) यदि आप अंतिम के परिणाम को निर्दिष्ट करने से पहले नकली को एक और कॉल करते हैं, तो परिणाम नकली के तरीके पर निर्भर करते हैं। –

2

मैंने कभी मॉकिटो या easymock के साथ काम नहीं किया है, लेकिन मुझे नहीं लगता कि कॉल करता है जो आपको लगता है कि यह करता है। यह किसी भी विशेष तरीके से mockedList.get(0) की व्याख्या नहीं करता है। विधि get को mockedList ऑब्जेक्ट पर सामान्य रूप से निष्पादित किया गया है, और परिणाम उसमें when को सौंप दिया गया है।

1

mockedList.get(0) एक विधि कॉल के लिए वाक्यविन्यास है, और ठीक है। वह विधि क्या बिल्कुल स्पष्ट नहीं है। mockedList का रनटाइम प्रकार LinkedList का उप-वर्ग होगा mock विधि द्वारा लौटाया गया, जिसे कार्यान्वित किया जा सकता है कि मॉकिंग फ्रेमवर्क कितना फिट दिखाई देता है।

4

जावा नकली पुस्तकालयों आम तौर पर इस तरह काम करते हैं:

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

फिर, जब "रीप्ले मोड" शुरू होता है, तो नकली उदाहरण केवल आमंत्रण की सूची से अपेक्षाओं की जांच करता है (विधि + पैरामीटर & वापसी मान)। इंटरफेस के साथ काम पर

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