[java] JUnit에서 src / test / resources 디렉토리의 경로를 얻는 방법?

src / test / resources에서 다음을 사용하여 파일을로드 할 수 있다는 것을 알고 있습니다.

getClass().getResource("somefile").getFile()

그러나 어떻게 src / test / resources 디렉토리 의 전체 경로를 얻을 수 있습니까? 즉, 파일을로드하고 싶지 않습니다. 디렉토리의 경로를 알고 싶습니다.



답변

ClassLoader수업 과 협력 해보십시오 .

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("somefile").getFile());
System.out.println(file.getAbsolutePath());

A ClassLoader는 클래스에서로드를 담당합니다. 모든 클래스에는에 대한 참조가 있습니다 ClassLoader. 이 코드는 File리소스 디렉토리에서를 반환합니다 . 호출 getAbsolutePath()하면 절대 값이 리턴 Path됩니다.

Javadoc ClassLoader: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html


답변

클래스 로더를 망칠 필요가 없습니다. 사실 그것은 클래스 로더 자원이기 때문에 들어갈 나쁜 습관 하지 jar 아카이브에있을 때 java.io.File 오브젝트 입니다.

Maven은 테스트를 실행하기 전에 현재 작업 디렉토리를 자동으로 설정하므로 다음을 사용할 수 있습니다.

    File resourcesDirectory = new File("src/test/resources");

resourcesDirectory.getAbsolutePath() 그것이 실제로 필요한 경우 올바른 값을 반환합니다.

src/test/data테스트에서 파일 시스템을 통해 데이터에 액세스하려면 디렉토리를 작성하는 것이 좋습니다 . 이것은 당신이하고있는 일을 분명히합니다.


답변

PathJava 7에서 간단하게 사용합니다.

Path resourceDirectory = Paths.get("src","test","resources");

청초한!


답변

스프링 프로젝트 인 경우 아래 코드를 사용하여 src / test / resource 폴더 에서 파일을 가져올 수 있습니다 .

File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));


답변

JUnit 4.12 및 Java8을 사용하는 Maven3 프로젝트가 있습니다. myxml.xml아래 에있는 파일의 경로를 얻으려면 src/test/resources테스트 케이스 에서이 작업을 수행하십시오.

@Test
public void testApp()
{
    File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile());
    System.out.println(inputXmlFile.getAbsolutePath());
    ...
}

IntelliJ IDE를 사용하여 Ubuntu 14.04에서 테스트되었습니다. 여기를 참조 하십시오 .


답변

의 모든 내용 src/test/resourcestarget/test-classes폴더에 복사됩니다 . 따라서 maven 빌드 중에 테스트 리소스에서 파일을 가져 오려면 test-classes다음과 같이 폴더 에서 파일 을로드해야 합니다.

Paths.get(
    getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
    Paths.get("somefile")
).toFile()

세분화 :

  1. getClass().getProtectionDomain().getCodeSource().getLocation().toURI()-에 URI를 제공하십시오 target/test-classes.
  2. resolve(Paths.get("somefile"))– 폴더 someFile로 확인 target/test-classes합니다.

오리지널 anwser는 이쪽 으로부터 가져옵니다


답변

@Steve C와 @ ashosborne1이 제공하는 옵션에는 차이점과 제약이 있습니다. 그들은 반드시 명시되어야한다고 믿습니다.

언제 사용할 수 File resourcesDirectory = new File("src/test/resources");있습니까?

  • 1 테스트가 maven을 통해서만 실행되지만 IDE를 통해서는 실행되지 않을 때.
  • 2.1 테스트가 maven 또는
  • 2.2 IDE를 통해 하나의 프로젝트 만 IDE로 가져옵니다. (필자는“가져온”용어를 사용하여 IntelliJ IDEA에 사용됩니다. 이클립스 사용자는 maven 프로젝트도 가져옵니다.) 이것은 작동합니다. IDE를 통해 테스트를 실행할 때 작업 디렉토리가 프로젝트와 동일합니다.
  • 3.1 테스트가 maven 또는
  • (당신은, 당신은 일반적으로 여러 프로젝트를 가져 학생이 아닌 경우) IDE, 하나 개 이상의 프로젝트를 통해 3.2 IDE로 가져, 그리고 당신이 IDE를 통해 테스트를 실행하기 전에, 당신은 수동으로 구성하여 테스트를 위해 작업 디렉토리. 해당 작업 디렉토리는 테스트가 포함 된 가져온 프로젝트를 참조해야합니다. 기본적으로 IDE로 가져온 모든 프로젝트의 작업 디렉토리는 하나입니다. 아마 그것은 IntelliJ IDEA단지 제한 이지만 모든 IDE가 이와 같이 작동한다고 생각합니다. 그리고 수동으로 수행해야하는이 구성은 전혀 좋지 않습니다. 서로 다른 maven 프로젝트에 존재하지만 하나의 큰 “IDE”프로젝트로 가져 오는 여러 테스트를 사용하여이를 기억하고 긴장을 풀고 작업에서 즐거움을 얻지 못하게합니다.

@ ashosborne1에서 제공하는 솔루션 (개인적으로 선호하는 솔루션)에는 테스트를 실행하기 전에 수행해야하는 2 가지 추가 요구 사항이 필요합니다. 이 솔루션을 사용하는 단계 목록은 다음과 같습니다.

  • “src / test / resources /”안에 테스트 폴더 (“teva”)와 파일 (“readme”)을 만듭니다 :

    src / test / resources / teva / readme

    테스트 폴더에 파일을 작성해야합니다. 그렇지 않으면 작동하지 않습니다. Maven은 빈 폴더를 무시합니다.

  • 을 통해 프로젝트를 한 번 이상 빌드하십시오 mvn clean install. 테스트도 실행합니다. 전체 프로젝트를 빌드하지 않고 maven을 통해 테스트 클래스 / 메소드 만 실행하면 충분할 수 있습니다. 결과적으로 테스트 리소스가 테스트 클래스에 복사됩니다. 경로는 다음과 같습니다.target/test-classes/teva/readme

  • 그 후에는 @ ashosborne1에서 이미 제공 한 코드를 사용하여 폴더에 액세스 할 수 있습니다 (죄송합니다.이 항목 목록 내 에서이 코드를 올바르게 편집 할 수 없습니다).

public static final String TEVA_FOLDER = "teva"; ...
URL tevaUrl = YourTest.class.getClassLoader().getResource(TEVA_FOLDER);
String tevaTestFolder = new File(tevaUrl.toURI()).getAbsolutePath();

이제 원하는만큼 IDE를 통해 테스트를 실행할 수 있습니다. mvn clean을 실행할 때까지 대상 폴더가 삭제됩니다.

IDE를 통해 테스트를 실행하기 전에 테스트 폴더 내에 파일을 작성하고 maven을 처음으로 실행해야합니다. 이 단계가 없으면 IDE에서 테스트 리소스를 만든 다음 IDE를 통해서만 테스트를 작성하고 실행하면 오류가 발생합니다. mvn을 통해 테스트를 실행하면 테스트 리소스가 target / test-classes / teva / readme에 복사되고 클래스 로더가 액세스 할 수있게됩니다.

IDE에서 하나 이상의 메이븐 프로젝트를 가져와야하는 이유와 왜 그렇게 많은 복잡한 것들이 필요한지 묻습니다. 저에게 주요 동기 중 하나는 IDA 관련 파일을 코드에서 멀리 유지하는 것입니다. 먼저 IDE에서 새 프로젝트를 만듭니다. IDE 관련 파일을 보유한 가짜 프로젝트입니다. 그런 다음 기존 Maven 프로젝트를 가져옵니다. 가져온 프로젝트에서 IDEA 파일을 원본 가짜 프로젝트에만 보관하도록 강요합니다. 결과적으로 코드 중에 IDE 관련 파일이 표시되지 않습니다. SVN은 그것들을 보지 않아야합니다 (그러한 파일을 무시하도록 svn / git을 구성하도록 제안하지 마십시오). 또한 매우 편리합니다.