【发布时间】: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