जावा 8 के बाद से आप तर्क-कम any
विधि का उपयोग कर सकते हैं और प्रकार तर्क कंपाइलर द्वारा अनुमान लगाया जाएगा:
verify(bar).doStuff(any());
व्याख्या
जावा 8 में नई बात यह है कि एक अभिव्यक्ति के लक्ष्य प्रकार का उपयोग इसके उप-अभिव्यक्तियों के प्रकार के मापदंडों का अनुमान लगाने के लिए किया जाएगा। जावा 8 से पहले केवल उन तरीकों का तर्क दिया जाता है जहां टाइप पैरामीटर इंट्रेंस (ज्यादातर समय) के लिए उपयोग किया जाता है।
इस स्थिति में पैरामीटर प्रकार का doStuff
लक्ष्य प्रकार होगा any()
, और वापसी मान प्रकार any()
उस तर्क प्रकार से मेल खाने के लिए चुना जाएगा।
यह तंत्र जावा 8 में मुख्य रूप से लैम्ब्डा एक्सप्रेशन संकलित करने के लिए जोड़ा गया था, लेकिन यह आमतौर पर टाइप इंफ़ेक्शन में सुधार करता है।
आदिम प्रकार
यह आदिम प्रकारों के साथ काम नहीं करता है, दुर्भाग्य से:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
समस्या यह है कि संकलक Integer
रिटर्न मान के रूप में अनुमान लगाएगा any()
। मॉकिटो को इसके बारे में पता नहीं होगा (टाइप इरेज़र के कारण) और संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान लौटाएं, जो कि है null
। रनटाइम पास करने से intValue
पहले उस पर विधि को कॉल करके रिटर्न वैल्यू को अनबॉक्स करने का प्रयास करेगा doStuff
, और अपवाद फेंक दिया जाता है।
any
विधि को सिर्फ काम करना चाहिए। आप उन चीजों के लिए जवाब नहीं तलाशते हैं जो सिर्फ काम करती हैं!