का उपयोग कर URL वर्ग का नकल करने में असमर्थ मैं अपने कोड में java.net.URL क्लास के निर्माण को नकल करने के लिए PowerMockito का उपयोग करने का प्रयास कर रहा हूं। असल में, मैं वास्तविक HTTP अनुरोध को होने से रोकना चाहता हूं और इसके बजाय 1) अनुरोध किए जाने पर डेटा की जांच करें और 2) एक मजाकिया प्रतिक्रिया पर अपना खुद का परीक्षण डेटा वापस आपूर्ति करें।PowerMockito/Mockito
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
कोड मैं इस तरह दिखता है परीक्षण करना चाहते हैं:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
अपने परीक्षण परिदृश्य में इससे पहले मैं नकली wlInvokeUrlString "MyURLString" मैच के लिए यह है कि मैं क्या कोशिश कर रहा हूँ है। मैंने नकली इंजेक्ट करने की कोशिश करते समय, नई लाइन के विभिन्न अन्य रूपों का उपयोग करने का भी प्रयास किया है। कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, यह कभी भी कन्स्ट्रक्टर को हस्तक्षेप नहीं करता है। मैं बस इतना करना चाहता हूं कि खोलने के लिए कॉल को पकड़ें() और इसे वास्तविक के बजाय मेरा मॉक किया गया HTTP कनेक्शन वापस कर दें।
मैंने एक ही स्क्रिप्ट में इस से आगे के अन्य वर्गों का मज़ाक उड़ाया है और ये उम्मीद के अनुसार काम कर रहे हैं। या तो मुझे आंखों की दूसरी जोड़ी (शायद सच) की आवश्यकता है या यूआरएल वर्ग के बारे में कुछ अद्वितीय है। मैंने नोटिस किया कि अगर मैं "जब नया (URL.class) .withAnyArguments()" का उपयोग करता हूं और "फिर वापसी" को "फिर Answers" में बदलता हूं तो मैं इसे ट्रिगर करने के लिए प्राप्त कर सकता हूं। केवल समस्या यह है कि मुझे अपने कोड के लिए यूआरएल कॉल कभी नहीं मिला। जो मैं देखता हूं वह पैरामीटर के लिए सभी नल के साथ URL.class के लिए 3-तर्क कन्स्ट्रक्टर का आविष्कार है। क्या यह कक्षा जावा रनटाइम से हो सकती है और परीक्षण धावक द्वारा बूटस्ट्रैप किया जा सकता है? किसी भी प्रकार की मदद की बेहद सराहना की जाती है।
आपको इसका परीक्षण करने के लिए Powermock की आवश्यकता नहीं है। फ़ाइल आधारित पथ ("फ़ाइल: //my-test.properties") का उपयोग करने के उदाहरण के लिए बस स्ट्रिंग यूआरएल का मज़ाक उड़ाएं। यह काम करेगा, और आप जिस डेटा को चाहते हैं उसे पास कर सकते हैं –
@ जेरेमीबी क्या आप इसे थोड़ा और विस्तारित कर सकते हैं? यह एक सुरुचिपूर्ण और सरल समाधान की तरह लगता है, लेकिन परीक्षण के तहत कोड एक HttpURLConnection की अपेक्षा कर रहा है और मुझे क्लासकास्ट अपवाद प्राप्त होता है यदि मैं किसी फ़ाइल को संदर्भित करने के लिए URL स्ट्रिंग को बदलता हूं (यानी java.lang.ClassCastException: sun.net.www.protocol। ftp.FtpURL कनेक्शन को java.net पर नहीं डाला जा सकता है। HttpURLConnection)। साथ ही, आप इस दृष्टिकोण का उपयोग कर अनुरोध पर इनपुट पैरामीटर कैसे सत्यापित करेंगे? – Jim
आपको सीधे 'HttpURLConnection', लेकिन 'URL' और' URLConnection' का उपयोग नहीं करना चाहिए। 'HttpURLConnection' में उपयोगी कुछ भी नहीं है। परिवहन परत को सारणी देने के लिए यह एक यूआरएल का उद्देश्य है। –