从JUnittesting用例中找不到资源文件

概要

我的JUnittesting没有在执行过程中find他们需要的文件。 我正在使用Maven进行依赖pipe理和编译。

细节

testing用例所需的所有文件位于: 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

有任何想法吗?

以下问题没有帮助

为什么我无法在Maven中使用Junittesting来访问src / test / resources?

在JUnit @BeforeClass中加载属性文件

如何处理Junit中的testing数据?

软件版本

Ubuntu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse(用于Web开发人员的Java EE IDE)Indigo服务版本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> 

我的错误,资源文件实际上复制到target/test-classes这个问题似乎是由于我的项目名称中的空格 ,例如Project%20Name

我现在正在加载文件如下,它的工作原理:

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

或者,(取自Java:如何从一个逃逸的URL中获取文件? )这可能会更好(不依赖于Apache Commons):

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

你知道Maven是基于configuration偏好的公约吗? 所以你不应该configuration默认的东西。

所有这些东西都代表了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> 

这实际上是多余的,除非你想重写默认值。 所有这些设置都默认为默认值。

您可以通过使用此命令检查您的有效POM来validation

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> 

例如,如果我想指向一个不同的testing资源path或资源path,您应该使用这个,否则你不。

  <resources> <resource> <directory>/home/josh/desktop/app_resources</directory> </resource> </resources> <testResources> <testResource> <directory>/home/josh/desktop/test_resources</directory> </testResource> </testResources>