2012-05-10 3 views
51

요약자원은

내 JUnit 테스트들이 실행 중에 필요한 파일을 찾을 수 없습니다 JUnit 테스트 케이스에서 찾을 수없는 파일. 종속성 관리 및 컴파일을 위해 Maven을 사용하고 있습니다. src/test/resources : 테스트 케이스에 필요한

세부

모든 파일에 있습니다. 예 : src/test/resources/resourceFile.txt.

URL url = getClass().getResource("/resourceFile.txt").getFile(); 
File file = new File(url); 

그러나 file.exists() 반환 false :

내가 다음 코드를 사용하여 자원에 액세스 할 수 있습니다. 그리고 내가 오류는 다음과 같습니다 src/test/resources에서 파일에 복사되지 않아요 것처럼

URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile(); 
File file = new File(url); 

것 같다 :

Tests in error: 
    myJUnitTestCase(tests.MyJUnitTestClass): /home/me/workspace/Project%20Name/target/test-classes/resourceFile.txt (No such file or directory) 

참고, 다음과 같은 오류 (제거 / 접두사 통지를) 제공 target/test-classes.

아이디어가 있으십니까?

다음 질문

Why Can't I access src/test/resources in Junit test run with Maven?

Loading Properties File In JUnit @BeforeClass

How to deal with the test data in Junit?

소프트웨어 버전

Ubun 도움이되지 않았다 TU 12.04

아파치 메이븐 2.2.1

자바 1.7.0

이클립스 (웹 개발자를위한 자바 EE IDE) 인디고 서비스 릴리스 2

(절단) 메이븐 POM

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.groupId</groupId> 
    <artifactId>artifactId</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>name</name> 
    <build> 
     <finalName>name</finalName> 
     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 
     <sourceDirectory>src/main/java</sourceDirectory> 
     <testSourceDirectory>src/test/java</testSourceDirectory> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
      </resource> 
     </resources> 
     <testResources> 
      <testResource> 
       <directory>src/test/resources</directory> 
      </testResource> 
     </testResources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <encoding>UTF-8</encoding> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 
+2

'src/test/resources의 파일이 target/test-classes'에 복사되지 않는 것 같습니다. 실제로 확인 했습니까? – ftr

+1

아니, 나는 바보 야 ... 미안. 방금 확인한 결과 실제로 복사 된 것을 확인할 수 있습니다. 어쩌면 경로의 "% 20"때문일 수 있습니까? –

+0

해당 파일에서 입력 스트림을 열려고합니까? 그렇다면 URL을 사용하는 대신 다음을 직접 수행 할 수 있습니다. .class.getClassLoader(). getResourceAsStream (fileName) –

답변

37

실수로 리소스 파일이 실제로 target/test-classes에 복사되었습니다.문제는 내 프로젝트 이름 인의 공백으로 인한 것 같습니다. Project%20Name.

다음과 같이 지금 파일을로드하고있어 그것을 작동 :

org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt")‌​); 

을 또는이 (아파치 코 몬즈에 종속) 더 좋을 수 없다 (Java: how to get a File from an escaped URL?에서 가져온) :

myClass().getResource("resourceFile.txt")‌​.toURI(); 
+0

사실이 질문에 대한 답변 : http://stackoverflow.com/questions/2166039/java-how-to-get-a-file-from-an-escaped-url – Kkkev

+0

감사합니다. 답변을 업데이트했습니다. –

+0

감사합니다 알렉스, 나는 똑같은 문제에 직면 해 있으며 그 대답에 따라 나를 위해 일한다. +1 !! – Hatim

10

Maven은 컨벤션을 기본으로합니다. pardigm? 따라서 기본값 인 것을 구성해서는 안됩니다.

모든 것들은 Maven의 기본값을 나타냅니다. 그래서 가장 좋은 방법은 그것을 이미 정의한 것이 아닙니다.

+1

팁 주셔서 감사합니다. 내가 추가 한 이유는 내가 Maven에 익숙하지 않았기 때문에 내가 명시 적으로 (마법 제거하기) ... 싶었지만 앞으로는 불필요한 구성을 제거 할 것이다. –

+1

@AlexAverbuch가 요청한 동작이 mvn의 기본 동작인지 확인 하시겠습니까? – jayunit100

+1

Tycho 및 eclipse-plugin을 패키징 유형으로 사용하는 경우 build.properties 파일의 src/test/resources를 반드시 추가해야합니다. – Arcadien

1

이것은 기본값을 대체하려는 경우를 제외하고 실제로 중복됩니다. 이러한 모든 설정은 암시 된 기본값입니다.

당신은 내가 당신이 그렇지 않으면이를 사용해야 다른 테스트 자원 경로 또는 리소스 경로를 가리려면,이 명령 예를 들어

mvn help:effective-pom

<finalName>name</finalName> 
    <directory>target</directory> 
    <outputDirectory>target/classes</outputDirectory> 
    <testOutputDirectory>target/test-classes</testOutputDirectory> 
    <sourceDirectory>src/main/java</sourceDirectory> 
    <testSourceDirectory>src/test/java</testSourceDirectory> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
    </testResources> 

를 사용하여 효과적인 POM을 확인하여 다음을 확인 할 수 있습니다 너는하지 않는다.

<resources> 
     <resource> 
      <directory>/home/josh/desktop/app_resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>/home/josh/desktop/test_resources</directory> 
     </testResource> 
    </testResources> 
관련 문제