से getResourceAsStream मैं एक परियोजना के लिए एक जुनीट टेस्टकेस बना रहा हूं जिसे प्रारंभिकरण के दौरान कॉन्फ़िगरेशन फ़ाइल लोड करने की आवश्यकता है।JUnit
यह कॉन्फ़िगरेशन फ़ाइल प्रोजेक्ट के अंदर src/main/resource/config फ़ोल्डर में है और बिल्ड मेवेन के दौरान इसे JAR के अंदर/config फ़ोल्डर में रखती है।
प्रारंभ वर्ग, वहाँ इस बयान का उपयोग करने से फ़ाइल में लिखा है:
ClassLoader classloader = this.getClass().getClassLoader();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(classLoader.getResourceAsStream("/config/config.xml")));
समस्या मैं यह है कि जब मैं तैनाती और यह काम करता है के रूप में उम्मीद है, तथापि, जब भी मैं आवेदन सर्वर में इस जार को अंजाम ग्रहण के भीतर एक जुनीट टेस्टकेस में इसे चलाएं, getResrouceAsStream विधि शून्य लौटाता है।
यह देखते हुए कि वर्ग my.package.MyClassTest.java है, और यह src/परीक्षण/जावा में रहती है कि/मेरी/पैकेज/MyClassTest.java, मैं पहले से ही में config.xml फ़ाइल की एक प्रतिलिपि रखने की कोशिश की सफलता के बिना निम्न फ़ोल्डरों:
- src/test/resources/config
- src/test/resources/my/package/config
- src/test/java/my/package/config
मुझे पता है कि इसी तरह के सवाल StackOverflow में कई बार कहा गया है यहाँ है, लेकिन सभी की प्रतिक्रियाएं मैंने पाया जिस तरह से फ़ाइल लोड किया जाता है बदलते देखें और, हालांकि कोड को बदलने में कोई हो सकता है विकल्प, मैं सिर्फ फ़ाइल के लिए सही जगह ढूंढना पसंद करूंगा, इसलिए मुझे उन चीजों को संशोधित करने की आवश्यकता नहीं है जो पहले से ही उत्पादन वातावरण में काम करते हैं।
तो, मुझे इस फ़ाइल को अपने जुनीट परीक्षण में उपयोग करने में सक्षम होने के लिए कहां रखना चाहिए?
अद्यतन
मैं सिर्फ कोड में एक छोटा सा परिवर्तन के साथ समाधान के साथ आया था: इसके बजाय classloader का उपयोग कर संसाधन प्राप्त करने के लिए की है, मैं सीधे वर्ग प्रयोग किया है:
Class clazz = this.getClass();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(clazz.getResourceAsStream("/config/config.xml")));
और यह फ़ाइल को सफलतापूर्वक src/test/resource/config/config.xml से पढ़ता है। Class.getResourceAsStream विधि है::
हालांकि, वहाँ है यहाँ बहुत अजीब बात है
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
और अगर मैं यह डिबग, मैं स्पष्ट रूप से देख सकते हैं कि इस getClassLoader0() रिटर्न ठीक उसी वस्तु (उसी आईडी) पिछले कॉल की तुलना में, this.getClass()। getResourceAsStream() (जो मैंने बनाए रखा है, केवल मानों की तुलना करने के लिए) !!!
यहां क्या हो रहा है ?!
कार्य के बीच में एक नई विधि कॉल डालने के दौरान विधि को कॉल क्यों नहीं किया जाता है?
ईमानदारी से, मैं इसके सामने वास्तव में आश्चर्यचकित हूं।
बीटीडब्ल्यू, मैं जुनीट संस्करण 4.10 का उपयोग कर रहा हूं। क्या यह getClassLoader कॉल को किसी तरह से छेड़छाड़ कर सकता है?
बहुत धन्यवाद,
कार्ल्स
ग्रहण में स्रोत/परीक्षण/संसाधन/स्रोत स्रोत है? –
@SotiriosDelimanolis यदि आप इसे उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे वोट दूंगा। –
@ सॉटिरियोसेलिमैनोलिस: हाँ, यह है। दरअसल, जब मैंने इसे देखा तो मुझे एहसास हुआ कि ग्रहण इसे मैवेन परियोजनाओं के लिए डिफ़ॉल्ट रूप से लेता है। –