2012-11-20 60 views
0

所以我必須寫一個字符串到文件的方法:JUnit和文件的寫訪問

public static void saveStringToFile(String path, String string) { 

    File file = new File(path); 
    if (!file.exists()) { 
     try { 
      file.createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } 
    } 

    FileWriter out = null; 
    try { 
     out = new FileWriter(path); 
     out.write(string); 
     if (out != null) { 
      out.close(); 
     } 
    } catch (FileNotFoundException e) { 

     e.printStackTrace(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

我與每個測試之前運行下面的安裝方法,測試類(每一個前刪除testfile的):

public static final String TEST_FILE = "somefile.xml"; 

// ...

@Before 
public void setUp() throws IOException { 
    if (MyCustomClass.fileExists(TEST_FILE)) { 
     new File(TEST_FILE).delete(); 
    } 
} 

我的每一個測試的嘗試使用該方法來寫一些東西到文件saveStringToFile()。它成功了幾次,但一個隨機點我終於得到了java.io.IOException: Access is denied。還是不知道爲什麼出現這種情況 - 有時它發生在test1的,有時TEST3 ...

它工作正常,當我使用Java7 FileIO專注,但我需要遷移回的Java6 ...

+3

你是如何執行測試的?您的測試運行器是否可以並行運行它們,並且測試正在彼此之間嘗試訪問該文件? – Omaha

+0

添加同步塊。 – Shark

+0

我正在用Eclipse運行它>作爲JUnit測試運行......懷疑測試可能是平行運行的 - 我如何驗證這一點以及如何使用它? – dstronczak

回答

0

所以,可能JUnit沒有運行它平行,因爲我想它不會默認這樣做。

的問題是在我readfile方法:

private String readFile(String path) throws FileNotFoundException { 
    return (new Scanner(new File(path))).useDelimiter("\\Z").next(); 
} 

做工精細,我不得不修復

private String readFile(String path) throws FileNotFoundException { 
    Scanner scanner = (new Scanner(new File(path))); 
    String s = scanner.useDelimiter("\\Z").next(); 
    scanner.close(); 
    return s; 
} 

Scannerclose()方法是關鍵......

1

您是否測試了您的能夠創建,寫入和刪除文件,或者您正在測試什麼被寫入文件?

如果是後者,那麼也許你應該嘲笑/覆蓋saveStringToFile(...)方法,而是專注於驗證你的單元測試代碼實際上是否產生了正確的輸出。

如果是前者,那麼我很贊同@奧馬哈的建議,即你的測試跑步者可能會同時運行多個測試。

希望有所幫助。

1

有一些異常處理問題。對out.close()的調用應位於finally塊內的單獨try-catch塊內。如果寫入文件時引發異常,則文件永遠不會關閉。

我會建議看看像Apache Commons IO這樣有許多有用的IO方法,如FileUtils.writeStringToFile()