2014-04-15 5 views
6

नीचे मेरी DataTap कक्षा में मेरे निजी तरीका है और मैं JMockit का उपयोग कर JUnit परीक्षण इस निजी विधि करने के लिए कोशिश कर रहा हूँ -यूनिट परीक्षण करते समय jmockit का उपयोग कर एक निजी विधि में शून्य स्ट्रिंग को कैसे पास करें?

private void parseResponse(String response) throws Exception { 
    if (response != null) { 
     // some code 
    } 
} 
तो नीचे

मैंने लिखा JUnit परीक्षण लेकिन अशक्त मामले के लिए, यह किसी भी तरह एनपीई पर फेंक दिया जाता है जूनिट टेस्ट खुद ही।

DataTap tap = new DataTap(); 
Deencapsulation.invoke(tap, "parseResponse", "hello"); 

// this line throws NPE 
Deencapsulation.invoke(tap, "parseResponse", null); 

तो मेरे सवाल है - वहाँ किसी भी तरह से मैं null stringparseResponse JUnit परीक्षण के हिस्से के रूप JMockit का उपयोग कर विधि को पारित कर सकते हैं?

यह मुझे लगता है कि लाइन पर क्या देख रहा हूँ है -

प्रकार अशक्त का तर्क स्पष्ट रूप से डाली जानी चाहिए [] वस्तु को के लिए varargs वापस लाने (वस्तु, स्ट्रिंग, वस्तु के आह्वान .. ।) प्रकार Deencapsulation से। इसे वैकल्पिक रूप से ऑब्जेक्ट पर एक varargs आमंत्रण

+0

कि कोड काम करना चाहिए:

Deencapsulation.invoke(instance, methodName, nonNullArgs); Deencapsulation.invoke(instance, methodName, parameterTypes, methodArgs); 

आप अगर आर्ग में से एक इस तरह शून्य है parameterTypes में पारित करने के लिए की जरूरत है। मुझे लगता है कि समस्या कहीं और है। – tbodt

+0

यह मैं उस पंक्ति पर क्या देख सकता हूं 'टाइप नल का तर्क स्पष्ट रूप से ऑब्जेक्ट [] को ऑब्जेक्ट [] ऑब्जेक्ट, स्ट्रिंग, ऑब्जेक्ट ...) के आमंत्रण के लिए ऑब्जेक्ट [] में डाला जाना चाहिए। इसे वैकल्पिक रूप से एक varargs आमंत्रण के लिए ऑब्जेक्ट में डाला जा सकता है और यह वास्तव में असफल रहा है। – john

उत्तर

14

एक नज़र at the documentation पता चलता है कि क्या आपको लगता है कि हस्ताक्षर के साथ कार्य करना चाहते हैं संभव नहीं है:

... अगर एक शून्य मान की जरूरत है पारित होने के लिए, पैरामीटर प्रकार के लिए कक्षा वस्तु के बजाय पास किया जाना चाहिए

अगर ऐसी बात है, तो Class वस्तु के साथ ही उदाहरण में गुजरती हैं।

Deencapsulation.invoke(tap, "parseResponse", String.class); 
+0

धन्यवाद मकोटो। मैंने कोशिश की और मुझे 'अमान्य शून्य मान एक तर्क 1 के रूप में पारित किया गया। कोई सुझाव क्या गलत है? – john

+1

क्लास ऑब्जेक्ट * बदले * 'null' के पास, इसके अलावा नहीं:' Deencapsulation.invoke (टैप, "parseResponse", String.class) '।विधि अधिभार के कारण, जेमॉकिट को प्रत्येक पैरामीटर के प्रकार को जानने की आवश्यकता है, ताकि प्रतिबिंब के माध्यम से वांछित विधि मिल सके; इस तरह के एक प्रकार को केवल 'इनकॉक (...)' पर कॉल में स्पष्ट रूप से पास करके एक गैर-शून्य तर्क * या * से निर्धारित किया जा सकता है। –

+0

डॉक्स अब यहां: http://jmockit.org/tutorial/ReflectionUtilities.html#deencapsulatingMethods – jordanpg

0

त्रुटि क्या कहता है, के लिए वैकल्पिक रूप से डाला जा सकता है। यही कारण है, यह करने के लिए लाइन बदलने के लिए:

Deencapsulation.invoke(tap, "parseResponse", (Object) null); 
+0

धन्यवाद tbodt। मैंने कोशिश की और मुझे 'अमान्य शून्य मान एक तर्क 0 के रूप में पारित किया गया। कोई सुझाव क्या गलत है? – john

0

मैं उस तरह किया था जब मैं toString विधि में अशक्त स्ट्रिंग आवश्यक प्रकार में null कास्टिंग

mockedObject.toString((String) null) 
0

आप सुविधा विधि का उपयोग कर रहे हैं के माध्यम से यानी पास करनी होगी और आप पूर्ण विधि का उपयोग करने की आवश्यकता है । किसी ऑब्जेक्ट इंस्टेंस पर विधि लागू करने के दो तरीके हैं। पहली विधि nonNullArgs से पैरामीटर टाइप प्राप्त करके काम करती है।

DataTap tap = new DataTap(); 
String response = null; 
Class[] parameterTypes = { String.class }; 
Deencapsulation.invoke(tap, "parseResponse", parameterTypes, response); 
संबंधित मुद्दे