2014-06-30 7 views
7

मैं जुनीट 4, जावा 8 और ग्रैडल 1.12 का उपयोग कर रहा हूं। मेरे पास डिफ़ॉल्ट जेसन के साथ एक फ़ाइल है जिसे मुझे लोड करने की आवश्यकता है। मेरी परियोजना में src/main/java/ (प्रोजेक्ट स्रोत शामिल है), src/main/resources/ (खाली), src/test/java/ (इकाई परीक्षण स्रोत), और src/test/resources/ (जेसन डेटा फ़ाइल लोड करने के लिए) निर्देशिकाएं हैं। build.gradle फ़ाइल रूट में है।यूनिट टेस्ट में एक्सेस संसाधन

मेरी कोड में मेरे पास है:

public class UnitTests extends JerseyTest 
{ 
    @Test 
    public void test1() throws IOException 
    { 
    String json = UnitTests.readResource("/testData.json"); 
    // Do stuff ... 
    } 

    // ... 
    private static String readResource(String resource) throws IOException 
    { 
    // I had these three lines combined, but separated them to find the null. 
    ClassLoader c = UnitTests.class.getClassLoader(); 
    URL r = c.getSystemResource(resource); // This is returning null. ???? 
    //URL r = c.getResource(resource); // This had the same issue. 
    String fileName = r.getFile(); 
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) 
    { 
     StringBuffer fileData = new StringBuffer(); 
     char[] buf = new char[1024]; 
     int readCount = 0; 
     while ((readCount = reader.read(buf)) != -1) 
     { 
     String readData = String.valueOf(buf, 0, readCount); 
     fileData.append(readData); 
     } 

     return fileData.toString(); 
    } 
    } 
} 

मैं क्या पढ़ा से, कि मुझे संसाधन फ़ाइल के लिए उपयोग करना चाहिए। हालांकि, जब मैं यूआरएल का उपयोग करने की कोशिश करता हूं, तो मुझे एक शून्य सूचक अपवाद मिलता है, क्योंकि getSystemResource() कॉल रिटर्न शून्य देता है।

मैं अपनी संसाधन फ़ाइलों को कैसे एक्सेस करूं?

+0

आप अपने classpath में/src/परीक्षण/संसाधन फ़ोल्डर है? –

+0

मुझे शक है। हालांकि मैं कक्षाएं लोड नहीं कर रहा हूं। – kwiqsilver

उत्तर

12

संसाधन नाम स्लैश से शुरू नहीं होते हैं, इसलिए आपको इससे छुटकारा पाना होगा। संसाधन को UnitTests.getClassLoader().getResourceAsStream("the/resource/name") के साथ अधिमानतः पढ़ा जाना चाहिए, या यदि File आवश्यक है, new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI())

जावा 8 पर, आप की तरह कुछ की कोशिश कर सकते:

URI uri = UnitTests.class.getClassLoader().getResource("the/resource/name").toURI(); 
String string = new String(Files.readAllBytes(Paths.get(uri)), CharSet.forName("utf-8")); 
+0

मुद्दा स्लैश था। मेरे द्वारा पढ़े गए सभी उदाहरणों के कारण किसी कारण से एक प्रमुख स्लैश था। जावा 8 सुझाव में कुछ कीड़े हैं। इसका उपयोग करने वाले किसी भी व्यक्ति के लिए सही कोड यहां दिया गया है: 'URI uri = UnitTests.class.getClassLoader()। GetResource (संसाधन) .toURI(); नई स्ट्रिंग (फ़ाइलें.readAllBytes (Paths.get (uri)), Charset.forName ("utf-8")); ' – kwiqsilver

+1

या तो उदाहरण 'क्लासलोडर # getResource' के बजाय' कक्षा # getResource' का उपयोग कर रहे थे, या फिर उदाहरण थे) वे गलत थे। जावा 8 कोड स्निपेट फिक्स्ड। –

0

मुझे लगता है कि आप getSystemResource प्राप्त करने के बजाय संसाधन प्राप्त करना चाहते हैं। उत्तरार्द्ध का उपयोग किया जाता है, उदाहरण के लिए, फ़ाइल सिस्टम से एक फ़ाइल पढ़ें, जहां पथ जार के संदर्भ में निर्दिष्ट नहीं किया जाएगा।

तुम भी वर्ग लोडर को छोड़ सकते हैं: UnitTests.class.getResource("...")

Docs about resources here

संपादित: उत्तर here में कुछ और विस्तृत टिप्पणी कर रहे हैं।

+0

मैं getResources का उपयोग कर रहा था, लेकिन यह एक ही त्रुटि उत्पन्न करता है। – kwiqsilver

+0

अधिक सावधानी से पढ़ने के बाद, मुझे एहसास हुआ कि मैं getSystemResource दस्तावेज़ों को गलत समझा। इसका तर्क सिस्टम पर्यावरण के क्लासपाथ के संदर्भ में निर्दिष्ट है, फाइल सिस्टम रूट नहीं, क्योंकि जब मैं उपरोक्त उत्तर लिखता था तो मैं सोच रहा था। मैं लिंक के लिए यहां जवाब छोड़ दूंगा। –

संबंधित मुद्दे