【问题标题】:Can't delete folder created by junit TemporaryFolderRule无法删除由 junit TemporaryFolderRule 创建的文件夹
【发布时间】:2011-07-19 05:45:40
【问题描述】:

我有一个类来管理我们对其进行一些传入处理的一些文件的存档。在尝试测试归档过程时,我使用了 JUnit 中的 TemporaryFolder 规则。

在我们正常的 Linux 开发站上,测试运行没有任何问题,在一些团队成员的一些 Windows 笔记本电脑上,但在我的 Mac 上,我最终得到以下结果:

whenFullExtractReceivedArchivesArePurged(housekeeping.ArchiveHousekeeperIntegrationTest):无法删除 /var/folders/Pl/PlAbV+EpHhW2-nPFrFrwI++++TI/-Tmp-/junit5525189319546810170/secondaryArchive

这是测试:

package housekeeping;

import static housekeeping.ArchiveHousekeeper.PRIMARY_ARCHIVE;
import static housekeeping.ArchiveHousekeeper.SECONDARY_ARCHIVE;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class ArchiveHousekeeperIntegrationTest {

  private static final String LANDING_FOLDER = "landing";
  private static final String PREVIOUS_FILE_NAME = "previousChild.txt";
  private static final String CURRENT_FILE_NAME = "currentChild.txt";
  private File primaryArchiveFolder;
  private File secondaryArchiveFolder;
  private File landingFolder;

  @Rule
  public TemporaryFolder temporaryFolder = new TemporaryFolder();

  @Before
  public void setUp() throws IOException {
    temporaryFolder.getRoot();
    primaryArchiveFolder = temporaryFolder.newFolder(PRIMARY_ARCHIVE);
    secondaryArchiveFolder = temporaryFolder.newFolder(SECONDARY_ARCHIVE);
    landingFolder = temporaryFolder.newFolder(LANDING_FOLDER);

    createChildFile(primaryArchiveFolder, CURRENT_FILE_NAME);
    createChildFile(secondaryArchiveFolder, PREVIOUS_FILE_NAME);
  }

  @Test
  public void whenFullExtractReceivedArchivesArePurged() throws IOException {
    final String extractFileName = "fullExtract0101.zip";
    final File extractFile = new File(landingFolder, extractFileName);
    extractFile.createNewFile();
    final ArchiveHousekeeper housekeeper = new ArchiveHousekeeper(extractFile);

    housekeeper.archiveFile();

    assertThat(landingFolder.list().length, is(0));
    assertThat(primaryArchiveFolder, containsFile(extractFileName));
    assertThat(secondaryArchiveFolder, not(containsFile(PREVIOUS_FILE_NAME)));
    assertThat(secondaryArchiveFolder, containsFile(CURRENT_FILE_NAME));
    assertThat(primaryArchiveFolder, not(containsFile(CURRENT_FILE_NAME)));
  }

  @Factory
  private static Matcher<File> containsFile(final String fileName) {
    return new TypeSafeMatcher<File>() {

      @Override
      public void describeTo(final Description description) {
        description.appendText("a directory containing " + fileName);
      }

      @Override
      public boolean matchesSafely(final File item) {
        return item != null && item.isDirectory() && Arrays.asList(item.list()).contains(fileName);
      }
    };
  }

  private File createChildFile(final File parent, final String child) throws IOException {
    final File folder = new File(parent, child);
    folder.createNewFile();
    return folder;
  }
}

我不确定我是否看到某种奇怪的权限问题或什么,这就是它的样子。我只是发现测试创建文件夹时令人困惑,因此它似乎应该对其具有权限。

值得注意的是,被测代码似乎确实可以工作,在其他平台上测试运行成功。

【问题讨论】:

    标签: java file-permissions junit4


    【解决方案1】:

    事实证明,最初的问题没有足够的细节。 ArchiveHousekeeper 使用的是来自 Guava 的 Files.recursivelyDelete。

    文件删除的特定实现有一些保护来阻止符号链接的删除。 TemporaryFolder 在 Mac 上的工作方式会创建一个符号链接,它不会删除辅助存档的内容,因此删除实际文件夹会失败。导致抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2020-06-09
      相关资源
      最近更新 更多