2011-03-20 116 views
0

我有一個類管理一些文件的存檔,我們做一些傳入處理。在嘗試測試歸檔過程時,我使用JUnit中的TemporaryFolder規則。無法刪除由junit創建的文件夾TemporaryFolderRule

在我們正常的Linux開發站測試運行沒有任何問題,在有些Windows筆記本電腦的一些團隊成員具有的,但在我的Mac我最終得到如下:

whenFullExtractReceivedArchivesArePurged(housekeeping.ArchiveHousekeeperIntegrationTest):無法刪除的/ var /文件夾/ 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; 
    } 
} 

我不知道如果我我是出現某種奇怪的權限問題或什麼,這就是它的樣子。當測試創建文件夾時,我只是覺得這很令人困惑,所以它似乎應該有權限。

值得注意的是,在其他平臺上,測試下的代碼似乎可以正常工作。

回答

0

事實證明,原始問題中沒有足夠的細節。 ArchiveHousekeeper使用來自Guava的Files.recursivelyDelete。

文件刪除的特定實現有一些保護來停止刪除符號鏈接。 TemporaryFolder在Mac上的工作方式創建一個符號鏈接,它不會刪除二級存檔的內容,因此刪除實際文件夾失敗。導致異常被拋出。