为什么这个文件无法删除?

时间:2011-12-27 10:59:03

标签: java file-io junit guava

我编写了单元测试(JUnit 4),它执行一些逻辑并将结果写入文件。在@Before带注释的方法中,它创建文件,在@After中应该删除该文件。它不是,我无法弄明白,为什么。

我正在使用Google Guava 10.01 Files 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 个答案:

答案 0 :(得分:2)

只需即时File 意味着将创建实际文件。为此,请在该实例上调用createNewFile()createTempFile()

在您的测试方法中,您似乎没有将该文件引用传递给任何可能创建该文件或在其中写入任何内容的人...我错过了什么或者您发布的代码是否缺少某些关键行?

答案 1 :(得分: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的一部分。