2010-04-02 13 views
17

मेरे पास कोड का एक टुकड़ा है जो फ़ाइल से डेटा पढ़ता है। मैं परीक्षण उद्देश्यों के लिए इस कोड में IOException को मजबूर करना चाहता हूं (मैं यह जांचना चाहता हूं कि कोड इस मामले में सही कस्टम अपवाद फेंकता है या नहीं)।फ़ाइल पढ़ने के दौरान फोर्स IOException

क्या ऐसी फ़ाइल बनाने का कोई तरीका है जिसे पढ़ने से संरक्षित किया गया है, उदाहरण के लिए? शायद कुछ सुरक्षा जांच से निपटने में मदद मिल सकती है?

कृपया ध्यान दें कि एक गैर-मौजूद फ़ाइल का नाम पारित करने में सहायता नहीं हो सकती है, क्योंकि FileNotFoundException में एक अलग पकड़ खंड है।

यहाँ सवाल की बेहतर समझ के लिए कोड का टुकड़ा है:

BufferedReader reader = null; 
    try { 

     reader = new BufferedReader(new FileReader(csvFile)); 

     String rawLine; 
     while ((rawLine = reader.readLine()) != null) { 
      // some work is done here 
     } 

    } catch (FileNotFoundException e) { 
     throw new SomeCustomException(); 
    } catch (IOException e) { 
     throw new SomeCustomException(); 
    } finally { 
     // close the input stream 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException e) { 
       // ignore 
      } 
     } 
    } 
+0

फेंकता आप एक फ़ाइल है कि आप को पढ़ने के लिए अनुमति नहीं कर रहे हैं पढ़ने की कोशिश कर सकते हैं परिभाषित करें। लिनक्स '/ proc/kcore' पर एक अच्छी शर्त है, जैसा'/etc/shadow' है। –

+1

कोई जवाब नहीं, लेकिन एक अवलोकन। पूर्ण स्टैक ट्रेस को संरक्षित करने के लिए आपको IOException को अपने कस्टम अपवाद के साथ लपेटना चाहिए। यानी 'नया SomeCusomException फेंक दें (ई) ' –

उत्तर

-1

तुम हमेशा फेंक कर सकते हैं अपने खुद के IOException:

throw new IOException("Test IOException"); 
+0

मैंने मूल प्रश्न के लिए कोड जोड़ा। ऐसा लगता है कि आप इसे समझ में नहीं आया। – DixonD

0

तुम भी किसी ऐसी फ़ाइल के लिए इस अपवाद बढ़ा कर सकता है विशाल।

2

आप फ़ाइल को एक सुपरसियर के रूप में बनाने और फिर इसे मानक उपयोगकर्ता के रूप में पढ़ने का प्रयास कर सकते हैं। वहाँ अनुमति मुद्दों होना चाहिए। या सिर्फ यह मान लें कि आप लिनक्स पर हैं। आप इसे एक छिपी/संरक्षित निर्देशिका में डालने का भी प्रयास कर सकते हैं।

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं जो किसी भी लक्षित ओएस पर काम करेगा? – DixonD

+3

चूंकि ओएसई उनके फाइल सिस्टम और उपयोगकर्ता प्रबंधन के साथ क्या करते हैं, इस मामले में काफी भारी है, यह कठिन है। आप जावा फ़ाइल ऑब्जेक्ट का उपयोग करने और इसे सेट करने योग्य/सेट करने योग्य पर कॉल करने का प्रयास कर सकते हैं - http://java.sun.com/javase/6/docs/api/java/io/File.html#setReadable%28boolean%29 –

+1

अविश्वसनीय रूप से देखें चालाक जवाब। यह भी क्रॉस प्लेटफार्म है। इसे किसी तृतीय पक्ष मॉकिंग फ्रेमवर्क की आवश्यकता नहीं है। यदि आप मुझसे पूछें तो स्वीकार्य उत्तर होना चाहिए। – jontejj

4

यदि आप फ़ाइल नाम के बजाय रीडर को स्वीकार करने के लिए कोड को दोबारा प्रतिक्रिया दे सकते हैं, तो आप मैक्स का उपयोग कर सकते हैं। EasyMock के साथ आप एक नकली रीडर बना सकते हैं, और इसे अपनी इच्छित विधियों को कॉल करने पर IOException को फेंकने के लिए सेट कर सकते हैं। तो फिर तुम सिर्फ विधि करने के लिए इसे पारित परीक्षण किया जाना है, और घड़ी क्या होता है :-)

void readFile(Reader reader) throws SomeCustomException { 
    try { 
     String rawLine; 
     while ((rawLine = reader.readLine()) != null) { 
      // some work is done here 
     } 

    } catch (FileNotFoundException e) { 
     throw new SomeCustomException(); 
    } catch (IOException e) { 
     throw new SomeCustomException(); 
    } finally { 
     // close the input stream 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException e) { 
       // ignore 
      } 
     } 
    } 
} 

तो परीक्षण कोड:

mockReader = createMock(Reader.class); 
expect(mockReader.readLine()).andThrow(
     new IOException("Something terrible happened")); 
replay(mockReader); 

objectToTest.readFile(reader); 
+0

यह एक दयालुता है कि मैं परीक्षण कोड – DixonD

+1

@DixonD नहीं बदल सकता: यदि आप इसे बदल नहीं सकते हैं, और यह सही ढंग से डिज़ाइन नहीं किया गया है, तो आप इसे यूनिट-टेस्ट नहीं कर सकते हैं। सबसे अच्छा आप उम्मीद कर सकते हैं कि कुछ एकीकरण-परीक्षण करना है। –

1

आप बनाने के लिए Mockito या Easymock (+classpath) की तरह एक नकली पुस्तकालय का उपयोग कर सकते एक मॉक फ़ाइल ऑब्जेक्ट (नए libs में क्लासलोडर एक्सटेंशन होते हैं जो आपको फ़ाइल जैसे ठोस वर्गों का नकल करने देते हैं), या PowerMock (see blog) जैसे कुछ के साथ सहयोग कर सकते हैं और कन्स्ट्रक्टर कॉल के लिए एक नकली उत्पन्न कर सकते हैं, और कॉल किए जाने पर उपयुक्त अपवाद फेंक सकते हैं।

+0

कोड – DixonD

+0

में नकली पास करने का कोई तरीका नहीं है इस प्रकार के परीक्षण (क्लाउडलोडर मैनिपुलेशन का लाभ उठाने) के लिए PowerMock का उपयोग करने पर ब्लॉग एंट्री से लिंक करने का उत्तर संपादित करें – jayshao

7

अस्वीकरण: मैंने इसे गैर-विंडोज प्लेटफ़ॉर्म पर परीक्षण नहीं किया है, इसलिए विभिन्न फ़ाइल लॉकिंग विशेषताओं वाले प्लेटफ़ॉर्म पर इसका अलग-अलग परिणाम हो सकते हैं।

आप फ़ाइल पहले से ताला, तो आप एक IOException जब कुछ इसे से पढ़ने के लिए प्रयास करता है को गति प्रदान कर सकते हैं:

java.io.IOException: The process cannot access the file because another process has locked a portion of the file 

यह काम करता है, भले ही आप एक ही धागे में हैं।

final RandomAccessFile raFile = new RandomAccessFile(csvFile, "rw"); 
raFile.getChannel().lock(); 
+2

मेरे लिए काम नहीं करता - उबंटू का उपयोग .. लेकिन विचार अच्छा है :) –

+0

विंडोज़ पर काम करता है – panny

1

आप अपने BufferedReader पर करीब विधि लागू कर एक अपवाद के लिए मजबूर कर सकता है:

reader = new BufferedReader(new FileReader(csvFile)); 

    // invoke the Close() method. 
    reader.Close(); 

    String rawLine; 
    while ((rawLine = reader.readLine()) != null) { 
     // some work is done here 
    } 

मुझे आशा है कि मदद करता है

यहां कुछ नमूना कोड है।

0

मैं FileNotFoundException का उपयोग करने के खिलाफ अनुशंसा करता हूं। यदि आप फ़ाइल के लिए एक विशिष्ट अपवाद फेंकना नहीं चाहते हैं, तो मैं csvFile.exists() की जांच करूंगा।

उदाहरण के लिए, आप सीएसवीफ़ाइल एक निर्देशिका बना सकते हैं। मैं अपने कोड का परीक्षण किया और फेंक दिया:

File file = new File("actually_a_directory.csv"); file.mkdir(); yourCode(file); // throws FileNotFoundException: "actually_a_directory.csv (Access is denied)"

मेरी राय में, एक फ़ाइल वास्तव में एक निर्देशिका जा रहा है FileNotFound के समान नहीं है, फिर भी यह जावा में एक ही कार्य करता है।

0

अपने परीक्षण में एक ओवरलोड fileInputStream कि एक अपवाद

FileInputStream s; 
try { 
    s = new FileInputStream(fileName) { 

      @Override 
      public int read() throws IOException { 
       throw new IOException("Expected as a test"); 
      } 
     }; 
} catch (FileNotFoundException e) { 
    throw new RuntimeException(e.getMessage(), e); 
} 
संबंधित मुद्दे