我无法让单元测试使用src\test\resources
下提供的资源而不是src\main\resources
中提供的资源。是的,有问题的资源在两个地方的名称相同。
我做了大量研究,查看了StackOverflow的帖子,例如:
然而,这个基本问题令我难过。
我有一个非常标准的Maven Java项目设置:
src\main
src\test
Eclipse(感谢M2Eclipse插件)在其构建路径中都有src\main\java
,src\main\resources
,src\test\java
和src\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寻找不同的文件名。
答案 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文件中使用两个持久性单元,这可能不是最好的,但也可以正常工作。