2011-12-27 86 views
0

我寫單元測試(JUnit 4中),它執行一些邏輯和寫入結果到文件。在@Before註釋的方法它創建文件,並在@After該文件應該被刪除。這不是,但我無法弄清楚,爲什麼。爲什麼這個文件不能被刪除?

我使用谷歌番石榴10.01文件API。這裏是我的單元測試代碼:

public class CashierTest extends ContextedTest { 

    private File cashierFile; 

    @Before 
    public void createFile() throws Exception { 
     cashierFile = new File("D://workspace-sts/spring-miso/cashier.txt"); 
     cashierFile.createNewFile(); 
    } 

    @After 
    public void release() { 
     if (cashierFile.exists()) { 
      if (!cashierFile.delete()) { 
       System.out.println("Couldn't delete cashier file"); 
      } 
     } 
     cashierFile = null; 
    } 

    @Test 
    public void testCashier() throws Exception { 
     // file shouldn't contain any text 
     assertFalse(Files.toString(cashierFile, Charset.defaultCharset()).length() > 0); 

     Cashier cashier = (Cashier) context.getBean("cashier"); 
     ShoppingCart cart = (ShoppingCart) context.getBean("shoppingCartPrototype"); 
     cashier.checkout(cart); 

     assertTrue(cashierFile.exists()); 
     // file should contain text now 
     assertTrue(Files.toString(cashierFile, Charset.defaultCharset()).length() > 0); 
    } 

    @Override 
    protected void setPath() { 
     path = "sk/xorty/advancedioc/beans.xml"; 
    } 
} 

注:ContextedTest超是我測試的持有Spring容器它是不相關的ATM。

+2

莫非,該文件已被測試的一個打開,但沒有正確關閉,也就是說,仍有一些開放流躺在附近的一部分,哪些引用文件? – Dirk

+0

@Dirk:不,我不這麼認爲,這是使用該文件的唯一測試。 – Xorty

+0

@Dirk:其實是的,收銀員已經開了流:)寫下答案,我會接受它。 – Xorty

回答

2

簡單地即時File確實不是意味着將創建一個實際的文件。爲此,請致電createNewFile()createTempFile()

在您的測試方法,你似乎並沒有傳遞文件引用到任何人,可能可能創建文件或寫了什麼東西......我缺少的東西或您發佈的代碼所缺少一些關鍵的線?

+0

我在@After註釋的方法中添加了createNewFile調用,但該文件仍然不會被刪除。 – Xorty

+0

是的,我沒有通過文件本身,但收銀實例打開與測試中相同的路徑文件。對不起,我沒有注意到,你不可能知道這一點。 – Xorty

1

您應該使用TemporaryFolder規則使用JUnit 4,這將處理臨時測試目錄和文件的建立和拆除。

public static class HasTempFolder { 
    @Rule public TemporaryFolder folder= new TemporaryFolder(); 

    @Test public void testUsingTempFolder() throws IOException { 
    File createdFile= folder.newFile("myfile.txt"); 
    ... 
    } 
} 

Other Rules有一部分也JUnit 4中

相關問題