RETURN_DEEP_STUBS का उपयोग करने में समस्या यह है कि जब भी आप कोई विधि कॉल करते हैं तो आपको एक अलग नकली मिल जाएगी। मुझे लगता है कि आप अपने प्रश्न से सोचते हैं कि आप एक डिफ़ॉल्ट उत्तर का उपयोग करना चाहते हैं जो वास्तव में उस मॉक को वापस लाता है जिस पर इसे कॉल किया गया था, प्रत्येक विधि के लिए जिसमें सही रिटर्न प्रकार है। यह कुछ जैसा दिख सकता है। ध्यान दें कि मैंने इसका परीक्षण नहीं किया है, इसलिए इसमें टाइपो हो सकते हैं, लेकिन मुझे उम्मीद है कि किसी भी मामले में इरादा स्पष्ट है।
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class SelfReturningAnswer implements Answer<Object>{
public Object answer(InvocationOnMock invocation) throws Throwable {
Object mock = invocation.getMock();
if(invocation.getMethod().getReturnType().isInstance(mock)){
return mock;
}
else{
return RETURNS_DEFAULTS.answer(invocation);
}
}
}
फिर, जब आप अपना मॉक बनाते हैं, तो इसे अपने डिफ़ॉल्ट उत्तर के रूप में निर्दिष्ट करें। इससे आपका मॉक खुद को प्रत्येक विधि से वापस कर देगा; लेकिन जब आप एक विधि को कॉल करते हैं तो यह सामान्य मॉक की तरह व्यवहार करेगा जिसका वापसी प्रकार नकली के लिए गलत है।
इस
Builder mockBuilder = mock(Builder.class, new SelfReturningAnswer());
की तरह अपने नकली या इस वर्ग के लिए एक निरंतर बना सकते हैं और लिखने
@Mock(answer = SELF_RETURNING) private Builder mockBuilder;
आशा है कि मदद करता है की तरह कुछ।
स्रोत
2011-12-16 05:32:19
क्या आपको वाकई इसका नकल करने की ज़रूरत है? यह निर्भरता की तरह नहीं दिखता है जो मजाक करने योग्य है। यह "सेवा" प्रकार की कक्षा के बजाय "डेटा" प्रकार की तरह दिखता है। मुझे शायद ही कभी कक्षाएं बनाने में उपयोगी लगता है जहां वास्तविक व्यवहार नहीं है। –
यह सिर्फ एक उदाहरण है, वास्तविक निर्माता थोड़ा अधिक जटिल है और इसे इस मामले में परीक्षण करने की आवश्यकता नहीं है। –
क्या आप उन्हें अलग कर सकते हैं ताकि आपके पास * "गूंगा निर्माता" हो (जिसे मॉकिंग की आवश्यकता नहीं है) और फिर सर्विस पार्ट जो * * को मजाक करने की ज़रूरत है? –