2017-05-05 4 views
0

4 테스트는 리눅스와 윈도우에서 잘 작동 다음의 JUnit에 # getCanonicalFile()를 파일TemporaryFolder 및 Mac

java.lang.AssertionError: 
Expected :/var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/junit1451860092188597816/junit1906079638039608483.tmp 
Actual :/private/var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/junit1451860092188597816/junit1906079638039608483.tmp 

varprivate/var을 가리키는 심볼릭 링크이며 File#getCanonicalFile()을 통해 확인됩니다. 이것은 차이점입니다.

해결 방법이 있습니까? 이로 인해 내 컴퓨터에서 여러 가지 테스트가 실패하게됩니다.

+0

왜 파일의 경로와 그 정규 경로가 동일해야합니까? 왜 그걸 시험해 보는거야? – VGR

+0

@VGR 영향을받는 테스트는 좀 더 복잡하며 작성자는 아마도 Mac에서만 발생하므로 문제를 인식하지 못했을 것입니다. CI 서버는 현재 Linux에서만 독점적으로 실행되므로 테스트도 통과합니다. 나는 이것이 중기 적으로 적응되어야한다는 것을 알고 있지만, 나는 빠른 해결책을 찾고있다. – beatngu13

답변

1

바와 같이 Hugues Moreau's answer 지적, 가장 좋은 방법은 단순히 오히려 주어진 문제를 해결 노력보다는 테스트를 수정하는 것입니다.

그러나 빠른 해킹으로 테스트를 통과 할 수 있습니다. Apache Commons Lang에서

SystemUtils#IS_OS_MAC 사용
@Rule 
public TemporaryFolder tmp = new TemporaryFolder(System.getProperty("os.name").startsWith("Mac") 
     ? new File("/private/" + System.getProperty("java.io.tmpdir")) 
     : new File(System.getProperty("java.io.tmpdir"))); 

이 좀 더 판독한다 : (JUnit을 4.11으로 사용할 이전 버전 this answer 참조) 대안 TemporaryFolder 생성자를 사용함으로써, 하나의 상위 폴더를 설정할 수있다.

1

두 경로가 같은지 확인해야한다고 생각합니다.

따라서 getCanonicalFile()이 작동하는 방식으로 (symlinks를 해결하고 그 방법을 해결하지 않음) 문제를 해결하는 대신이를 수용 할 수 있으며 최종 테스트에서는 getCanonicalFile()을 양끝에 사용할 수 있습니다.

File expectedFile = ... 
File actualFile = ... 
assertEquals(expectedFile.getCanonicalFile(), tmpFile.getCanonicalFile()); 

그건, 나 :

java.nio.file.Files.isSameFile(expectedFile.toPath(), actualFile.toPath())