【问题标题】:JUnit Rule TemporaryFolderJUnit 规则临时文件夹
【发布时间】:2010-04-27 15:09:12
【问题描述】:

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

【问题讨论】:

    标签: java junit junit-rule


    【解决方案1】:

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

    【讨论】:

    • 即使使用 JUnit 4.8.2,我也不认为在 Windows 7 上 TemporaryFolder 规则无法正常工作。看起来是权限问题。
    • 链接已损坏;工作一:github.com/junit-team/junit4/issues/79
    【解决方案2】:

    这也有效。 EDIT 如果在 @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 尚未设置为临时位置。它也不会被清理。
    • 这会将目录留在 $TEMP 或 %TEMP% 目录中,因此仍在寻找真正的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多