为什么JUnit TemporaryFolder没有被删除?

18

JUnit的TemporaryFolder规则文档指出,它创建的文件和文件夹“保证在测试方法完成后删除(无论是否通过)”。然而,断言TemporaryFolder不存在失败了:

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class MyTest {

    @Rule
    public TemporaryFolder _tempFolder = new TemporaryFolder();

    @After
    public void after() {
        assertFalse(_tempFolder.getRoot().exists());  //this assertion fails!
    }

    @Test
    public void pass() throws IOException {
        assertTrue(true);
    }

我也发现该文件确实存在于文件系统中。

为什么它没有被删除?


1
如果临时文件夹中的任何文件存在锁定(例如未关闭的OutputStream),则不会删除临时文件夹。 - Cengiz
2个回答

12

这是因为JUnit在删除临时文件夹之前调用了after()。你可以尝试在@AfterClass方法中检查临时文件夹,你会发现它已被删除。这个测试证明了这一点。

public class MyTest {
   static TemporaryFolder _tempFolder2;

    @Rule
    public TemporaryFolder _tempFolder = new TemporaryFolder();

    @After
    public void after() {
        _tempFolder2 = _tempFolder;
        System.out.println(_tempFolder2.getRoot().exists());
    }

    @AfterClass
    public static void afterClass() {
        System.out.println(_tempFolder2.getRoot().exists());
    }

    @Test
    public void pass() {
    }
}

输出

true
false

3
我有同样的问题,在AfterClass中进行了测试,也没有删除,我尝试关闭所有打开的流,还是没有用。还有什么原因会导致临时文件和文件夹无法被删除呢? - Snedden27
我尝试创建一个@AfterClass方法来检查文件夹是否存在,然后手动尝试删除该文件夹,但无法成功。虽然被创建的文件已经不存在了,但原始的junit文件夹仍未被删除。 - Shaun McCready

3

我偶然发现了这个问题,遇到了同样的问题,在我的情况下,缺失删除的原因是临时文件夹的不当使用。

toString()方法返回内部文件夹名称,所以当尝试在其中创建新文件时,JUnit会在项目根目录中创建一个新文件夹。添加getRoot()方法解决了这个问题。

以下是我要指责的代码:

@Rule
public TemporaryFolder projectFolder = new TemporaryFolder();
//some lines later...
FileUtils.copyFile(deployFile, new File(projectFolder + "/deploy.xml"));
//how I fixed it
FileUtils.copyFile(deployFile, new File(projectFolder.getRoot() + "/deploy.xml"));

谢谢你挽救了我今天的余下时间。 - Neethu Lalitha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接