2011-03-20 1 views
0

들어오는 처리 작업을 수행하는 일부 파일의 보관 파일을 관리하는 클래스가 있습니다. 보관 프로세스를 테스트 할 때 JUnit에서 TemporaryFolder 규칙을 사용했습니다. 우리의 일반적인 리눅스 개발 스테이션에junit TemporaryFolderRule로 만든 폴더를 삭제할 수 없습니다.

시험은 일부 Windows는 회원이 팀의 일부를 랩톱에서, 아무 문제없이 실행되지만 내 Mac에서 나는 다음과 같은 치울 :

whenFullExtractReceivedArchivesArePurged (housekeeping.ArchiveHousekeeperIntegrationTest) : 나는 확실하지 않다

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

경우 :/var/폴더/PL/PlAbV + EpHhW2-nPFrFrwI ++++ TI/-Tmp-/junit5525189319546810170/secondaryArchive 여기

을 삭제하는 데 실패하면 테스트입니다 오전 어떤 종류의 이상한 허가 문제를 겪고 있거나 그것이 무엇처럼 보입니다. 그 테스트가 폴더를 생성 할 때 난처한 결과를 얻었으므로 폴더에 대한 사용 권한이 있어야하는 것처럼 보입니다.

테스트중인 코드가 제대로 작동하는 것처럼 보일만한 가치가 있습니다. 다른 플랫폼에서는 테스트가 성공적으로 실행됩니다.

답변

0

원래의 질문에는 자세한 내용이 충분하지 않았습니다. ArchiveHousekeeper는 Guava의 Files.recursivelyDelete를 사용하고있었습니다.

파일 삭제의 특정 구현에는 심볼 링크 삭제를 방지하기위한 몇 가지 보호 기능이 있습니다. TemporaryFolder가 Mac에서 작동하는 방식은 심볼릭 링크를 만들고 보조 보관 파일의 내용을 삭제하지 않기 때문에 실제 폴더를 삭제할 수 없습니다. 던져지는 예외를 유도합니다.