1

我有一些代码将文件写入我选择的目录。我目前有一个测试,它利用 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 ...
}

问题是我希望在测试完成时删除创建的目录(以及在其中创建的文件)(无论是成功还是失败)。

理想情况下,这只是使用 a@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 规则一定不能是静态的。

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

4

1 回答 1

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 注释公共静态 void 无参数方法会导致它在类中的任何测试方法之前运行一次。超类的@BeforeClass 方法将在当前类之前运行。 文档

@下课以后

如果在 BeforeClass 方法中分配昂贵的外部资源,则需要在类中的所有测试都运行后释放它们。使用 @AfterClass 注释公共静态 void 方法会导致该方法在类中的所有测试都运行后运行。即使 BeforeClass 方法抛出异常,所有 @AfterClass 方法也保证运行。在超类中声明的@AfterClass 方法将在当前类之后运行。 文档

于 2013-07-25T00:18:44.813 回答