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

问题描述 投票:0回答:2

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

有什么优雅的解决方案吗?

java junit4 junit-theory
2个回答
3
投票

尝试在方法上使用

@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 方法 将在当前班级的课程之后运行。 文档


0
投票

使用

TemporaryFolder
作为 JUnit v4 Class Rule 可能更可取,如下所示:

@ClassRule public static TemporaryFolder globalFolder = new TemporaryFolder();
© www.soinside.com 2019 - 2024. All rights reserved.