2012-08-23 14 views
12

निष्पादित करें मैं जुनीट परीक्षणों के लिए मॉकिटो का उपयोग कर रहा हूं। तो वहाँ किसी वर्ग एक है कि परीक्षण के लिए कोड मैं चाहता हूँ से प्रयोग किया जाता है:मॉकिटो: जब विधि एए को बुलाया जाता है तो बीबी

class A{ 

    public A(){} 

    public final String a(String x){ 
     return "A.a: " + x; 
    } 

} 

और मैं एक ही तर्क और वापसी मान के एक ही प्रकार के साथ एक और विधि कॉल के साथ विधि कॉल A.a बदलना चाहते हैं। जैसा कि आप देख सकते हैं, कक्षा को विस्तारित करके विधि को ओवरराइड करना संभव नहीं है क्योंकि यह अंतिम है। तो क्या मैं अब विधि B.b के साथ एक और वर्ग बी है:

class B{ 

    public B(){} 

    public String b(String x){ 
     return "B.b: " + x; 
    } 

} 

अब मुझे यकीन है कि हर बार जब A.a कोड से कहा जाता है बनाना चाहते, B.b की वापसी मान के बजाय प्रयोग किया जाता है। क्या यह मॉकिटो (Mockito.when(A.a(x)).thenReturn(B.b(x)); जैसा कुछ) के साथ प्राप्त करने की संभावना है, लेकिन x के मान को जानने के बिना, उसी पैरामीटर x के साथ?

किसी भी मदद की सराहना की जाएगी, अग्रिम धन्यवाद!

+2

आप जिस परिदृश्य का परीक्षण करना चाहते हैं? क्यों एए() अंतिम है? और आप एए() की कॉल को प्रतिस्थापित क्यों करना चाहते हैं? जो मैं समझता हूं उससे आप एए() को ओवरराइड करना चाहते हैं, है ना? – Adelin

+1

मैं एंड्रॉइड लाइब्रेरी प्रोजेक्ट का परीक्षण कर रहा हूं (मैं एंड्रॉइड प्रोजेक्ट्स का परीक्षण करने में सक्षम होने के लिए रोबोलेक्ट्रिक का भी उपयोग करता हूं)। इस विशेष मामले में मैं एक डेटाबेस का परीक्षण करना चाहता हूं। कोड एक सामग्री रिज़ॉल्वर को कॉल करता है, सामग्री प्रदाता AndroidManifest.xml में परिभाषित किया गया है और मुझे सामग्री प्रदाता प्रोग्रामेटिक रूप से सेट करने का कोई तरीका नहीं मिला है क्योंकि यह परीक्षण चलाते समय xml से लोड नहीं होता है। तो मैं चाहता था कि कोड सामग्री समाधानकर्ता के बजाय सामग्री प्रदाता को कॉल करे। – user1448982

उत्तर

4

Mockito limits के अनुसार, मॉकिटो-जेनरेट किए गए मैक्स के लिए अंतिम विधियों को ओवरराइड करना संभव नहीं है। लेकिन आप रनटाइम पर कोड हैक करने के लिए Powermock का उपयोग कर सकते हैं ताकि मॉकिटो अपना काम कर सके।

+2

यह 'अंतिम' समस्या के आसपास हो जाता है और @ ब्राइस के उत्तर आपके मूल प्रश्न की जानकारी का उत्तर देते हैं। – jhericks

18

अच्छी तरह से मॉकिटो मोक्स कक्षा को विस्तारित करके और विधि को ओवरराइड करके काम करता है, जो आपके मामले में A.a(String) पर संभव नहीं है। यदि आप ऐसा करना चाहते हैं तो आपको अंतिम संशोधक को हटाना होगा।

अब यह सोचते हैं A.a(String) अंतिम नहीं है, तो आप क्या पूछना mockito साथ पूरी तरह से संभव है:

given(mockA.a(anyString()).willAnswer(returnOfB(bInstance)); 

Answer<String> returnOfB(final B bInstance) { 
    return new Answer<String>() { 
     public String answer(Invocation invocation) { 
      String arg = (String) invocation.getActualArguments()[0]; 
      return bInstance.b(arg); 
     } 
    }; 
} 

कृपया ध्यान दें यह जवाब एक फोन पर गलत नाम लिखा गया है और टाइपो हो सकता है, या, हालांकि आप मिलना चाहिए आप जो चाहते हैं उसे प्राप्त करने के लिए क्या किया जाना चाहिए इसका विचार।

चीयर्स

+0

धन्यवाद, लेकिन यह मेरे लिए कोई समाधान नहीं है क्योंकि मैं अंतिम संशोधक को हटा नहीं सकता हूं। यह एंड्रॉइड एसडीके से कुछ कोड है। – user1448982

+3

@ sergej-zagursky के पास अंतिम संशोधक समस्या के आसपास होने का उत्तर है, लेकिन यह आपके मूल प्रश्न की जानकारी का उत्तर देता है। इस प्रकार आप 'x' के मान पर अपना रिटर्न वैल्यू कैसे आधार करते हैं। – jhericks

+0

मैं "दिया गया" कैसे आयात करूं? – neves

1

असल में मैंने आपका सेटअप लिया और इसके साथ एक यूनिट-टेस्ट लिखा।

org.mockito.exceptions.misusing.MissingMethodInvocationException:: क्या चल रहा पॉपअप पहले कि स्पष्ट रूप से यह कहा गया है एक त्रुटि संदेश था जब() एक तर्क जो 'एक नकली पर एक विधि कॉल' हो गया है की आवश्यकता है।

और बाद में ट्रेस में यह कहता है कि "आप इनमें से किसी भी को अंतिम/निजी/बराबर()/हैशकोड() विधियों को दबाते हैं। उन विधियों को स्टब/सत्यापित नहीं किया जा सकता है।"

तो मॉकिटो के अनुसार आप अंतिम तरीकों को रोक नहीं सकते हैं, और यही वह है।

संपादित करें: तो आपको या तो अंतिम संशोधक को हटाना होगा या यदि आप इस वर्ग के साथ फंस गए हैं, तो इसके आस-पास एक और तरीका ढूंढें।