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);
    }

我还看到该文件确实存在于文件系统上。

为什么这个不被删除?

4

2 回答 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
于 2013-05-11T06:36:54.667 回答
1

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

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"));
于 2021-06-29T15:40:37.067 回答