Не могу удалить папку, созданную junit TemporaryFolderRule - PullRequest
0 голосов
/ 20 марта 2011

У меня есть класс, который управляет архивом некоторых файлов, для которых мы выполняем некоторую входящую обработку. При попытке протестировать процесс архивации я использовал правило TemporaryFolder в JUnit.

На наших обычных станциях разработки Linux тест проходит без проблем, на некоторых ноутбуках с Windows некоторые из членов команды имеют, но на моем Mac я получаю следующее:

whenFullExtractReceivedArchivesArePurged (housekeeping.ArchiveHousekeeperIntegrationTest): не удалось удалить / var / folder / Pl / PlAbV + EpHhW2-nPFrFrwI ++++ TI / -Tmp- / junit552518931954681ive70 100_представления

Вот тест:

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;
  }
}

Я не уверен, вижу ли я какую-то странную проблему с разрешением или что-то вроде этого. Я просто нахожу это недоумение, так как тест создает папку, поэтому кажется, что она должна иметь разрешения на нее.

Стоит отметить, что тестируемый код действительно работает, на других платформах тест проходит успешно.

1 Ответ

0 голосов
/ 21 марта 2011

Как оказалось, в исходном вопросе было недостаточно деталей. ArchiveHousekeeper использовал Files.recursivelyDelete from Guava.

Эта конкретная реализация удаления файла имеет некоторые средства защиты, чтобы остановить удаление символических ссылок. Способ, которым TemporaryFolder работает на Mac, создает символическую ссылку, и он не удаляет содержимое вторичного архива, поэтому удаление действительной папки не выполняется. Приводит к исключению бросается.

...