我有一些代码可以将文件写入我选择的目录。我目前有一个测试,它利用 JUnit 理论在许多不同的目录中运行此代码。它看起来类似于:
@DataPoints
public static File[] produceListOfDirs() {
return new File[] {
new File("some directory path here")
}
}
@Theory
public void myTest(File f) {
... run my code being tested with f ...
}
问题是我希望在测试完成后删除创建的目录(以及在其中创建的文件)(无论成功还是失败)。
理想情况下,这只是使用
@Rule
来指定临时目录并使用它:
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
@DataPoints
public static File[] produceListOfDirs() {
return new File[] {
new File(testFolder.getRoot())
}
}
@Theory
public void myTest(File f) {
... run my code being tested with f ...
}
但是当然这里的问题是@DataPoints只能注解静态方法,而TemporaryFolder规则一定不能是静态的。
有什么优雅的解决方案吗?
尝试在方法上使用
@BeforeClass
注释将所需的目录或文件设置为测试类的字段。然后可以使用 @AfterClass
注释将它们拆除。
private static File directory;
@BeforeClass
public static void setup() {
directory = new File("/path/to/file");
if(!directory.exists()){
directory.mkdir();
}
}
@AfterClass
public static void teardown() {
if(directory.exists()){
FileUtils.deleteDirectory(directory); //apache-commons-io
}
}
@课前
有时多个测试需要共享计算成本高昂的设置 (就像登录数据库一样)。虽然这可能会损害 测试的独立性,有时这是必要的优化。 使用 @BeforeClass 注释 public static void no-arg 方法会导致 它在类中的任何测试方法之前运行一次。这 超类的 @BeforeClass 方法将在超类的方法之前运行 当前班级。 文档
@课后
如果您在 BeforeClass 方法中分配昂贵的外部资源 您需要在类中的所有测试运行完毕后释放它们。 使用 @AfterClass 注释 public static void 方法会导致 运行类中的所有测试后运行的方法。全部 @AfterClass 方法保证运行,即使是 BeforeClass 方法 抛出异常。超类中声明的 @AfterClass 方法 将在当前班级的课程之后运行。 文档
使用
TemporaryFolder
作为 JUnit v4 Class Rule 可能更可取,如下所示:
@ClassRule public static TemporaryFolder globalFolder = new TemporaryFolder();