【问题标题】:TemporaryFolder not being deleted using JUnit @Rule没有使用 JUnit @Rule 删除 TemporaryFolder
【发布时间】:2020-03-25 20:42:35
【问题描述】:

我在使用 JUnit 的 @Rule 的单元测试中使用了一个临时文件夹。 测试完成后文件夹不会被删除

Java 版本:1.8

JUnit 版本:4.12

操作系统窗口 10

我正在临时文件夹下创建一个 file.csv,以便使用 org.apache.commons 中的 CSVPrinter 对其进行编辑

public class MyService {

public void createCSVFile(String basePath) {
        try (FileWriter out = new FileWriter(format("%s/file.csv", basePath));
             CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT.withHeader(HEADERS))) {
            //printer.PrintRecord(args);
        } catch (IOException e) {
            log.error("Failed to create file.csv under " + basePath, e);
        }
    }
}

测试:

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();
    private String folderPath;
    private MyService myService;

    @Before
    public void setup() throws IOException {
        folder.newFile("file.csv");
        folderPath = folder.getRoot().getPath();
    }

    @Test
    public void testing_myService() {
        myService.createCSVFile(folderPath);
        //Assert 
    }

当我打开文件夹时:C:\Users\me\AppData\Local\Temp\junit2290989758736528709 我仍然可以看到 file.csv,因为它没有被删除

我尝试将文件的创建迁移到测试中。它没有解决它

    @Test
    public void testing_myService() {
        folder.newFile("file.csv");
        myService.createCSVFile(folder.getRoot().getPath());
        //Assert 
    }

我添加了一个@After 方法来删​​除文件夹

    @After
    public void cleanup() throws IOException {
        //Tried several ways to delete the folder and file as well
        //FileUtils.forceDelete(folder.getRoot().getAbsoluteFile());
        //folder.getRoot().delete();
        //FileUtils.deleteDirectory(folder.getRoot());
        //new File(folderPath +"/file.csv").delete();

        //All methods did not delete neither the direcotry (with exception can't delete file.csv) nor deleted the file.csv
    }

我还尝试在不使用@Rule 的情况下自己调用folder.create();folder.delete(); 但是文件夹也没有被删除

在 windows 上查看属性时,file.csv 和文件夹被标记为只读

我试图在代码中改变它

folder.setWritable(true);
folder.setReadable(true);
folder.setExecutable(true);

也没有设法删除文件夹

我的目标是找到一个适用于任何检查代码的环境的解决方案,例如:Linux 服务器和 Windows 上的 CI 管道

此行为的任何其他原因?

【问题讨论】:

    标签: java linux windows junit junit4


    【解决方案1】:

    我怀疑某些代码持有文件句柄,导致临时目录无法被删除。

    我建议:

    @Rule
    public final TemporaryFolder folder = TemporaryFolder.builder()
        .assureDeletion()
        .build();
    

    如果 TemporaryFolder 无法删除文件夹,这应该会引发异常。

    【讨论】:

      【解决方案2】:

      您可能应该在项目结构中的文件夹中创建和删除。

      但由于权限问题,它可能无法正常工作: 要么更改文件夹的权限,让程序有删除权限,要么以管理员身份运行程序/IDE。

      这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 2017-08-28
        • 2017-04-28
        • 2023-04-01
        • 2014-08-26
        相关资源
        最近更新 更多