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