问题 为什么没有删除JUnit TemporaryFolder?


的文档 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);
    }

我也看到该文件确实存在于文件系统中。

为什么这不会被删除?


5324
2018-05-11 06:24


起源

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


答案:


这是因为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

9
2018-05-11 06:36



万分感谢!这里的文档有点误导。 - jveldridge
我有同样的问题,我在AfterClass中测试它,它也没有删除,我尝试关闭所有打开的流,还有什么可以导致临时文件和文件夹不被删除 - Snedden27