在静态方法中为理论创建Junit测试的临时目录

时间:2013-07-25 00:11:18

标签: java junit4 junit-theory

我有一些代码将文件写入我选择的目录。我目前有一个测试,利用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规则不能是静态的。

对此有任何优雅的解决方案吗?

1 个答案:

答案 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