繁体   English   中英

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

[英]Create temporary directory for Junit test in static method for theory

我有一些代码将文件写入到我选择的目录中。 我目前有一个测试,该测试利用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注释一个公共的静态void no-arg方法会导致它在类中的任何测试方法之前运行一次。 超类的@BeforeClass方法将在当前类之前运行。 文档

@下课以后

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM