source

JUnit에서 src/test/resources 디렉토리의 경로를 가져오려면 어떻게 해야 합니까?

factcode 2022. 8. 31. 22:31
반응형

JUnit에서 src/test/resources 디렉토리의 경로를 가져오려면 어떻게 해야 합니까?

src/test/resources에서 다음 파일을 로드할 수 있습니다.

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

단, src/test/resources 디렉토리의 풀패스는 어떻게 취득할 수 있습니까?파일을 로드하는 것이 아니라 디렉토리의 경로만 알고 싶습니다.

하역기 가지고 장난칠 필요 없어요.클래스 로더 리소스는 java.io이 아니기 때문에 실제로 사용하는 것은 나쁜 습관입니다.객체가 jar 아카이브에 있을 때 파일을 작성합니다.

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

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

resourcesDirectory.getAbsolutePath()꼭 필요한 경우 올바른 값이 반환됩니다.

작성 권장사항:src/test/data테스트에서 파일 시스템을 통해 데이터에 액세스하려면 디렉토리를 선택합니다.이것으로 당신이 뭘 하고 있는지 알 수 있어요.

를 사용하여 작업해 보십시오.ClassLoader클래스:

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

A ClassLoader는 클래스 로드를 담당합니다.모든 클래스에는ClassLoader. 이 코드는File를 참조해 주세요.부르기getAbsolutePath()그것은 절대적인 것을 반환한다.Path.

자바독:ClassLoader: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

자바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());
    ...
}

Ubuntu 14.04에서 IntelliJ IDE를 사용하여 테스트 완료.여기를 참조해 주세요.

모든 내용src/test/resources에 복사됩니다.target/test-classes폴더입니다.따라서 메이븐 빌드 중에 테스트 리소스에서 파일을 가져오려면 다음 위치에서 파일을 로드해야 합니다.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 테스트를 IDE가 아닌 maven에서만 실행하는 경우.
  • 2.1 언제 maven 또는 maven을 통해 시험을 실시할 것인가?
  • 2.2 IDE를 통해 하나의 프로젝트만 IDE로 Import됩니다.(인텔리J IDEA에서는 Import된 용어를 사용합니다.이클립스 유저도 메이븐 프로젝트를 Import 할 수 있다고 생각합니다).이렇게 하면 됩니다.IDE를 통해 테스트를 실행할 때 작업 디렉토리는 프로젝트와 동일합니다.
  • 3.1 언제 maven 또는 maven을 통해 시험을 실시할 것인가?
  • 3.2는 IDE를 통해 여러 프로젝트를 IDE로 Import합니다(학생이 아닌 경우 보통 여러 프로젝트를 Import합니다). IDE를 통해 테스트를 실행하기 전에 테스트용 작업 디렉토리를 수동으로 구성합니다.작업 디렉토리는 테스트를 포함하는 Import된 프로젝트를 참조해야 합니다.기본적으로 IDE로 가져온 모든 프로젝트의 작업 디렉터리는 하나뿐입니다.아마도 그것은 의 제한일 것이다.IntelliJ IDEA모든 IDE는 이렇게 동작합니다.또한 수동으로 수행해야 하는 이 구성은 전혀 좋지 않습니다.다양한 메이븐 프로젝트에 존재하는 여러 테스트로 작업하지만 하나의 큰 "IDE" 프로젝트로 가져온 테스트로 인해 우리는 이 점을 기억할 수 밖에 없습니다.또한, 긴장을 늦추지 않고, 작업으로부터 즐거움을 얻을 수 없습니다.

@ashosborne1(개인적으로는 이 솔루션을 선호합니다)이 제공하는 솔루션에는 테스트를 실행하기 전에 수행해야 할 두 가지 추가 요건이 있습니다.이 솔루션을 사용하는 순서는 다음과 같습니다.

  • "src/test/resources/" 내에 테스트 폴더("teva")와 파일("readme")을 만듭니다.

    src/test/teva/readme

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

  • 최소 1회 이상 프로젝트 구축:mvn clean install테스트도 실행합니다.전체 프로젝트를 구축하지 않고 메이븐을 통해 테스트 클래스/방법만 실행해도 충분할 수 있습니다.그 결과 테스트 리소스는 테스트 클래스에 복사됩니다.경로는 다음과 같습니다.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을 완전히 실행할 때까지.대상 폴더를 삭제합니다.

테스트 폴더 내에 파일을 작성하고 IDE를 통해 테스트를 실행하기 전에 먼저 maven을 실행하는 것이 필요합니다.이러한 절차를 수행하지 않으면 IDE 내에서 테스트 리소스를 생성하고 테스트를 작성하여 IDE에서만 실행하면 오류가 발생합니다.mvn을 통해 테스트를 실행하면 테스트 리소스가 타겟/테스트 클래스/테바/readme에 복사되고 클래스 로더가 이러한 리소스에 액세스할 수 있게 됩니다.

IDE에서 여러 개의 메이븐 프로젝트를 Import해야 하는 이유와 복잡한 것이 많은 이유를 물을 수 있습니다.저에게 있어서 주된 동기 중 하나는 IDA 관련 파일을 코드로부터 멀리 두는 것입니다.먼저 IDE에서 새 프로젝트를 만듭니다.IDE 관련 파일 보유자인 가짜 프로젝트입니다.그리고 기존 maven 프로젝트를 Import합니다.저는 Import된 프로젝트에 IDEA 파일을 원래 가짜 프로젝트에만 보관하도록 강요합니다.그 결과, 코드중에 IDE 관련의 파일은 표시되지 않습니다.SVN은 이러한 파일을 볼 수 없습니다(이러한 파일을 무시하도록 svn/git을 구성하도록 제안하지 마십시오.또한 그것은 매우 편리합니다.

내가 사용하는 가장 단순하고 깨끗한 솔루션, 테스트 클래스의 이름은 다음과 같습니다.TestQuery1그리고 또...resources에 있는 디렉토리test폴더는 다음과 같습니다.

├── java
│   └── TestQuery1.java
└── resources
    └── TestQuery1
        ├── query.json
        └── query.rq

의 URI를 취득하려면TestQuery1다음 작업을 수행합니다.

URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName());

파일 중 하나의 URI를 가져오려면TestQuery1, 다음 작업을 수행합니다.

File exampleDir = new File(currentTestResourceFolder.toURI());
URI queryJSONFileURI = exampleDir.toURI().resolve("query.json");

스프링을 사용하면 리소스 폴더(메인/리소스 또는 테스트/리소스)에서 쉽게 읽을 수 있습니다.

예를 들어 파일을 만듭니다.test/resources/subfolder/sample.json

@Test
public void testReadFile() {
    String json = this.readFile("classpath:subfolder/sample.json");
    System.out.println(json);
}

public String readFile(String path) {
    try {
        File file = ResourceUtils.getFile(path);
        return new String(Files.readAllBytes(file.toPath()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

일반적인 경우 리소스 폴더의 파일을 테스트에 사용할 수 없습니다.그 이유는 리소스 폴더의 리소스 파일이 항아리 안에 저장되기 때문입니다.따라서 파일 시스템에 실제 경로가 없습니다.

가장 간단한 솔루션은 다음과 같습니다.

  1. 리소스에서 임시 폴더로 파일을 복사하고 해당 임시 파일의 경로를 가져옵니다.
  2. 임시 경로를 사용하여 테스트를 수행합니다.
  3. 임시 파일을 삭제합니다.

TemporaryFolder부터JUnit를 사용하여 임시 파일을 만들고 테스트 후 삭제할 수 있습니다.수강원guava라이브러리는 파일 양식 리소스 폴더를 복사하는 데 사용됩니다.

리소스 폴더의 하위 폴더를 사용할 경우 다음과 같이 하십시오.good첫째, 리드선을 추가할 필요가 없습니다./리소스 경로로 이동합니다.

public class SomeTest {

    @Rule
    public TemporaryFolder tmpFolder = new TemporaryFolder();


    @Test
    public void doSomethinge() throws IOException {
        File file = createTmpFileFromResource(tmpFolder, "file.txt");
        File goodFile = createTmpFileFromResource(tmpFolder, "good/file.txt");

        // do testing here
    }

    private static File createTmpFileFromResource(TemporaryFolder folder,
                                                  String classLoaderResource) throws IOException {
        URL resource = Resources.getResource(classLoaderResource);

        File tmpFile = folder.newFile();
        Resources.asByteSource(resource).copyTo(Files.asByteSink(tmpFile));
        return tmpFile;
    }

}

넌 네가 있는 곳에 갈 수 있어

new File(".").getAbsolutePath()

그러면 src/test/module에 대한 경로를 얻을 수 있습니다.
대개는 그저 그렇다

new File("src/test/resources")

파일 개체에서 .getAbsolutePath()를 사용합니다.

getClass().getResource("somefile").getFile().getAbsolutePath()
List<String> lines = Files.readAllLines(Paths.get("src/test/resources/foo.txt"));
lines.forEach(System.out::println);

와, 정답이 아직 안 나왔어요!

MyClass.class.getResource("/somefile");
MyClass.class.getResourceAsStream("/somefile");

https://javachannel.org/posts/how-to-access-static-resources/

장치 테스트에서 스프링을 사용하여 최대 절전 모드를 주입하려면 다음을 사용하십시오.

@Bean
public LocalSessionFactoryBean getLocalSessionFactoryBean() {
    LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
    localSessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    localSessionFactoryBean.setPackagesToScan("com.example.yourpackage.model");
    return localSessionFactoryBean;
}

만약 당신이 그것을 가지고 있지 않다면hibernate.cfg.xml에 표시하다src/test/resources폴더는 자동으로 사용자의 폴더로 돌아갑니다.src/main/resources폴더입니다.

스프링에서는 다음을 사용할 수 있습니다.

import org.springframework.core.io.ClassPathResource;

// Don't worry when use a not existed directory or a empty directory
// It can be used in @before
String dir = new ClassPathResource(".").getFile().getAbsolutePath()+"/"+"Your Path";

언급URL : https://stackoverflow.com/questions/28673651/how-to-get-the-path-of-src-test-resources-directory-in-junit

반응형