JUnit's TemporaryFolder rule的文档说明它创建了
的文件和文件夹“保证在测试方法完成时删除(无论是否 通过或失败)“
但是,断言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);
}
我也看到该文件确实存在于文件系统中。
为什么不删除?
答案 0 :(得分:9)
这是因为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
答案 1 :(得分:0)
我偶然发现了面临同样问题的这个问题,在我的情况下,丢失删除的原因是对临时文件夹的不当使用。
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"));