我有一些代码将文件写入我选择的目录。我目前有一个测试,利用JUnit Theories运行这个代码与许多不同的目录。它看起来类似于:
@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规则不能是静态的。
对此有任何优雅的解决方案吗?
答案 0 :(得分:2)
尝试在方法上使用@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 强>
有时,多个测试需要共享计算成本高昂的设置 (比如登录数据库)。虽然这可以妥协 测试的独立性,有时候是必要的优化。 使用@BeforeClass注释public static void no-arg方法会导致 它在类中的任何测试方法之前运行一次。该 超级类的@BeforeClass方法将在那些之前运行 现在的课程。 Documentation
<强> @AfterClass 强>
如果在BeforeClass方法中分配昂贵的外部资源 你需要在类中的所有测试运行后释放它们。 使用@AfterClass注释公共静态void方法会导致这种情况 在运行类中的所有测试之后运行的方法。所有 即使是BeforeClass方法,也保证@AfterClass方法可以运行 抛出一个例外。在超类中声明的@AfterClass方法 将在当前课程之后运行。 Documentation