Java 未使用JUnit@Rule删除临时文件夹

Java 未使用JUnit@Rule删除临时文件夹,java,linux,windows,junit,junit4,Java,Linux,Windows,Junit,Junit4,我正在使用JUnit的@Rule在单元测试中使用一个临时文件夹。 测试完成后,不会删除该文件夹 Java版本:1.8 JUnit版本:4.12 操作系统windows 10 我正在临时文件夹下创建一个file.csv,以便使用org.apache.commons中的CSVPrinter对其进行编辑 public class MyService { public void createCSVFile(String basePath) { try (FileWriter out =

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

Java版本:1.8

JUnit版本:4.12

操作系统windows 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\junit2290979756528709 我仍然可以看到文件.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
    }
我还尝试调用
文件夹.create()
文件夹.delete()我自己而不使用@规则
但文件夹也没有被删除

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

我试着在代码中改变这一点

folder.setWritable(true);
folder.setReadable(true);
folder.setExecutable(true);
也无法删除该文件夹

我的目标是找到一个解决方案,该解决方案适用于在linux服务器和windows上签出代码的任何环境,例如:CI管道


这种行为还有其他原因吗?

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

但它可能因为权限问题而无法工作: 更改文件夹的权限,使程序具有删除权限,或者以管理员身份运行程序/IDE


这应该可以解决问题。

我怀疑某些代码持有文件句柄,阻止删除临时目录

我建议:

@Rule
public final TemporaryFolder folder = TemporaryFolder.builder()
    .assureDeletion()
    .build();
这将导致TemporaryFolder在无法删除文件夹时引发异常