JUnit规则TemporaryFolder

13

我正在使用JUnit 4.7中的@Rule注解创建一个TemporaryFolder。我尝试在测试的@Before(设置)方法中使用tempFolder.newFolder("someFolder")来创建一个临时文件夹的子文件夹,但似乎这个临时文件夹是在设置方法运行后才初始化的,这意味着我不能在设置方法中使用临时文件夹。这是正确的(可预测的)行为吗?

2个回答

8

这是Junit 4.7中的一个问题。如果您升级到更新的Junit(例如4.8.1),当您进入@Before方法时,所有的@Rule都将被执行。相关的错误报告在此处:https://github.com/junit-team/junit4/issues/79


2
即使使用JUnit 4.8.2,在Windows 7上,TemporaryFolder规则仍无法正常工作。看起来这是一个权限问题。 - exception
1
链接已损坏;有效链接为:https://github.com/junit-team/junit4/issues/79 - jwd

6

这也可以工作。如果在@Before方法中,看起来需要调用myfolder.create()。这可能是不好的实践,因为javadoc说不要调用TemporaryFolder.create()方法。第二次编辑:如果您不想在@Test方法中使用临时目录,则必须调用该方法来创建临时目录。还要确保关闭在临时目录中打开的任何文件,否则它们将不会自动删除。

<imports excluded>

public class MyTest {

  @Rule
  public TemporaryFolder myfolder = new TemporaryFolder();

  private File otherFolder;
  private File normalFolder;
  private File file;

  public void createDirs() throws Exception {
    File tempFolder = myfolder.newFolder("folder");
    File normalFolder = new File(tempFolder, "normal");
    normalFolder.mkdir();
    File file = new File(normalFolder, "file.txt");

    PrintWriter out = new PrintWriter(file);
    out.println("hello world");
    out.flush();
    out.close();
  }

  @Test
  public void testSomething() {
    createDirs();
    ....
  }
}

虽然这创建了一个新文件夹,但tempFolder实际上不在临时位置(它在你的工作目录中),因为myFolder没有被设置为临时位置。它也不会被清理掉。 - Jeff Storey
这将使目录留在$TEMP或%TEMP%目录中,因此仍在寻找真正的答案。 - Rob Spieldenner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接