测试时无法让Maven(和Eclipse)使用测试资源

时间:2012-07-01 12:31:11

标签: java eclipse unit-testing maven

我无法让单元测试使用src\test\resources下提供的资源而不是src\main\resources中提供的资源。是的,有问题的资源在两个地方的名称相同。

我做了大量研究,查看了StackOverflow的帖子,例如:

然而,这个基本问题令我难过。

我有一个非常标准的Maven Java项目设置:

  • 申请来源& src\main
  • 下的资源
  • 测试源& src\test
  • 下的资源

Eclipse(感谢M2Eclipse插件)在其构建路径中都有src\main\javasrc\main\resourcessrc\test\javasrc\test\resources

通过此设置,当我从src\main\resources中的Eclipse资源文件中运行我的单元测试时,正在引用它。我可以看到为什么(因为它们在构建路径中)但我不知道如何防止它。单元测试配置面板不允许我调整(默认)类路径组件的顺序。

即使我要掩饰我无法从Eclipse运行我的测试,Maven也不会很好玩。我可以看到processResources步骤正在将所有测试资源复制到target\test-classes树下。但是,在执行单元测试时,正在咨询target\classes下的资源文件的副本。

当然,我忽略了明显的。感谢您提供的任何帮助。

[编辑] 添加更多(可能相关的信息)

有问题的资源文件是名为persistence.xml的文件。 Eclipselink使用它来连接关系数据源。应用程序使用的文件版本位于src\main\resources\META-INF。 Maven构建(比如说WAR)将META-INF目录放在classes目录下。因此,EclipseLink工具会找到此文件。

src/main
  |
  + -- java/com/company/ProductDao.java
  | 
  + -- resources/META-INF/persistence.xml  (Requires application container)
  |
src/test
  |
  + -- java/com/company/ProductDaoTest.java
  | 
  + -- resources/META-INF/persistence.xml  (out of container for unit tests)
  |

这里需要注意的是: EclipseLink需要在类路径上的persistence.xml目录中使用名为META-INF的文件(是的,可以覆盖默认值但不要去那里)。

因此,当单元测试运行时,将调用相同的应用程序逻辑。但是,src\main\resources中的文件版本无法使用。 {em}不同版本在src\test\resources目录中可用。

由于src\main\resources中的版本正在使用,出现,我唯一的办法是在单元测试期间指示Eclipselink寻找不同的文件名。

2 个答案:

答案 0 :(得分:1)

这不是Maven问题的根源。如果将所有内容折叠到单个源文件夹中,则会遇到完全相同的问题。想想你到底在做什么。您的单元测试需要来自src / main的代码,否则它不会是该代码的单元测试。 src / main / java和src / main / resources构成您正在测试的工件。您不要混合和匹配单元测试的目录。

你基本上是这样做的:

/src/com/mycompany/myresource.txt        
/src/com/mycompany/MyAwesomeClass.java
/src/com/mycompany/myresource.txt
/src/com/mycompany/TestMyAwesomeClass.java

不要那样做。配置单元测试以从另一个文件加载模拟数据/资源文件。

我没有很多,如果Maven和Eclipse有任何问题。意识到Maven不是魔术。如果你打算使用Maven和Eclipse,那么一切都必须由POM文件驱动而不是相反。事情很美妙。

只是要重新声明,你的问题与Maven无关。您在类路径上声明了两次资源。您需要重新考虑您的单元测试。您可以使用“个人档案”来解决此问题,但这是对构建系统的滥用。

答案 1 :(得分:0)

我回答,然后花了一些时间试图再次弄明白。 在surefire文档中,它说测试类应该是classpath中的第一个: http://maven.apache.org/surefire/maven-surefire-plugin/examples/configuring-classpath.html

还有surefire显示(使用mvn --debug选项): [DEBUG]测试类路径:
... \目标\测试类
... \目标\班 ....平方米\库\的javax \企业\ CDI-API \ 1.2 \ CDI-API-1.2.jar
....平方米\库\的javax \ EL \ javax.el-API \ 3.0.0 \ javax.el-API-3.0.0.jar ... 但是它首先使用target \ classes。奇怪这个错误是前段时间报道的。 然后无论我做什么,都会先从classes文件夹中获取persistence.xml。

所以我必须在一个persistence.xml文件中使用两个持久性单元,这可能不是最好的,但也可以正常工作。