2012-05-10 6 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:私は、次のコードを使用してリソースにアクセスするには

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

注、以下同じエラー(削除/接頭辞に注意してください)を与える:私が手にエラーがあると

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

src/test/resourcesからファイルをにコピー取得されていないかのように思えます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

のApache Mavenの2.2.1

のJava 1.7.0

のEclipse(ウェブ開発者のためのJava EE IDE)インディゴサービスリリース2

(切り捨て)Mavenの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")‌​); 

をそれとも、これは(Apacheのコモンズには依存)良くないかもしれない(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のデフォルトを表します。だから、ベストプラクティスはすでにそれを定義していないということです。

<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> 
+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>