2011-10-29 9 views
12

द्वारा वापस किया गया था मान लें कि मेरे पास एक नकली वस्तु है, और मैं इसके किसी भी तरीके को रोकना नहीं चाहता, लेकिन मैं किसी ऑब्जेक्ट की विधि को रोकना चाहता हूं यह वापस आता है। उदाहरण के लिए,मॉकिटो - किसी ऑब्जेक्ट की विधि को दबाकर जो एक मॉक ऑब्जेक्ट विधि

when(mockObject.method1()).thenReturn(returnValue) 

, यह कैसे सामान्य रूप से किया जाता है, लेकिन मैं के लिए देख रहा हूँ है

when(mockObject.method1().method2()).thenReturn(returnValue) 

कि संभव है? अगर मैं ऐसा करता हूं तो मुझे एक NullPointerException मिलता है। वर्तमान में मैंने एक मॉक ऑब्जेक्ट को वापस करने के लिए पहली विधि को रोक दिया है, और फिर उस लौटे हुए मॉक ऑब्जेक्ट का उपयोग करके, दूसरी विधि को दबाएं। हालांकि, ये अस्थायी नकली वस्तुएं मेरे लिए बेकार हैं और कई विधियों को एक साथ करने के बाद, जिसके परिणामस्वरूप बहुत बेकार नकली वस्तुएं होती हैं।

संपादित करें: वास्तव में, यह संभव है कि कामों को चेन करना, लेकिन मेरी वस्तुएं एनपीई पैदा कर रही हैं। इस कोड (पहली पंक्ति) एक एनपीई खड़ी कर रहा है:

when(graphDb.index().getNodeAutoIndexer()).thenReturn(nodeAutoIndexer); 
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer); 

लेकिन इस कोड काम करता है:

IndexManager indexManager = mock(IndexManager.class); 
when(graphDb.index()).thenReturn(indexManager); 
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer); 
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer); 

तो चेनिंग getNodeAutoIndexer() जो एक AutoIndexer ऑब्जेक्ट, जबकि यह के लिए काम किया के लिए काम नहीं किया getRelationshipAutoIndexer() जो रिलेशनशिपऑटोइंडेक्सर देता है। दोनों रिटर्न वैल्यू निम्नानुसार मॉक किए गए हैं:

nodeAutoIndexer = (AutoIndexer<Node>) mock(AutoIndexer.class); 
relAutoIndexer = mock(RelationshipAutoIndexer.class); 

तो समस्या का कारण क्या हो सकता है?

उत्तर

13

कोई समस्या नहीं है।

के कोड के इन 4 लाइनों जांच:

IndexManager indexManager = mock(IndexManager.class); 
when(graphDb.index()).thenReturn(indexManager); 
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer); 
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer); 

पहली पंक्ति एक नकली indexManager पैदा करता है।

दूसरी बात इंडेक्स विधि कहने पर इंडेक्स प्रबंधक (पहली पंक्ति में बनाई गई नकली) को वापस करने के लिए नकली ग्राफ डीबी को बताती है।

तीसरा एक नकली इंडेक्स मैनेजर (पहली पंक्ति में बनाया गया) tode nodeAutoIndexer को वापस करने के लिए जब यह मिलता है NodeAutoIndexer विधि कहा जाता है।

और अंतिम पंक्ति graphDb.index() को कॉल करती है, जो नकली इंडेक्स प्रबंधक (आपने इसे दो पंक्तियों में करने के लिए कहा है) लौटाता है, और relAutoIndexer को वापस करने के लिए इस इंडेक्स प्रबंधक (जो कि आपने पहली पंक्ति में बनाया है) पूछता है जब इसकी getRelationshipAutoIndexer विधि कहा जाता है।

अंतिम पंक्ति केवल इसलिए काम करती है क्योंकि आपने नकली ग्राफ डीबी को बताया था कि इसकी अनुक्रमणिका विधि कहां से वापस आना है। यदि आपने पहले ऐसा नहीं किया था, तो नकली graphDb.index() विधि शून्य हो गई होगी और आपके पास एनपीई होगा।

+1

धन्यवाद। तो मान लें कि मेरे पास कार्यों की एक लंबी श्रृंखला है, क्या मुझे प्रत्येक कार्य को रोकने की प्रक्रिया को दोहराना होगा? उस कोड को प्राप्त करने का कोई तरीका नहीं है जो एनपीई को इंडेक्स() के बिना काम करने के लिए काम कर रहा है? मुझे लगता है कि मॉकिटो को किसी भी तरह से कार्यों के रिटर्न प्रकारों के आधार पर नकली वस्तुओं के साथ स्वचालित रूप से उन विधियों को रोकना चाहिए ताकि मुझे उन स्टब्बिंग कार्यों को परेशान करने की आवश्यकता न हो जिन्हें मुझे सीधे आवश्यकता नहीं है। मुझे केवल उन कार्यों को अन्य कार्यों तक पहुंचने की आवश्यकता है ... – gsingh2011

+1

नहीं। डिफ़ॉल्ट वापसी मान उन विधियों के लिए शून्य है जो ऑब्जेक्ट लौटाते हैं। आईएमएचओ, आपके पास जो समस्या है वह एक संकेत है कि आप डेमेटर के कानून का उल्लंघन करते हैं: अजनबियों से बात न करें। –

+4

ध्यान दें कि मॉकिटो एक गहरी स्टब सुविधा प्रदान करता है ('नकली (लीगेसी टाइप।कक्षा, RETURNS_DEEP_STUBS) '), लेकिन इसके उपयोग को हतोत्साहित करें क्योंकि आप डिमेटर के कानून जैसे _good design_ कानून तोड़ सकते हैं। कृपया ध्यान दें कि यह सुविधा अभी तक सामान्य प्रकारों, जैसे एक सूची के साथ काम नहीं करती है। – Brice

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