Java 测试时无法让Maven(和Eclipse)使用测试资源
我无法让单元测试使用Java 测试时无法让Maven(和Eclipse)使用测试资源,java,eclipse,unit-testing,maven,Java,Eclipse,Unit Testing,Maven,我无法让单元测试使用src\test\resources下提供的资源,而不是src\main\resources中提供的资源。是的,所讨论的资源在两个位置的名称相同 我做了大量研究,查看了StackOverflow的帖子,例如: 然而,这个基本问题让我感到困惑 我建立了一个非常标准的Maven Java项目: src\main下的应用程序源和资源 在src\Test Eclipse(得益于M2Eclipse插件)在其构建路径中拥有src\main\java、src\main\reso
src\test\resources
下提供的资源,而不是src\main\resources
中提供的资源。是的,所讨论的资源在两个位置的名称相同
我做了大量研究,查看了StackOverflow的帖子,例如:
src\main下的应用程序源和资源
- 在
src\Test
src\main\java
、src\main\resources
、src\test\java
和src\test\resources
所有功能
使用此设置,当我从Eclipse资源中运行单元测试时,src\main\resources
中的文件被引用。我知道原因(因为它们在构建路径中),但我不知道如何防止它。单元测试配置面板不允许我调整(默认)类路径组件的顺序
即使我要掩饰自己无法从Eclipse运行测试,Maven也不会表现得很好。我可以看到processResources
步骤正在将所有测试资源复制到target\test classes
树下。但是,当执行单元测试时,将查阅target\classes
下的资源文件副本
我肯定忽略了一些显而易见的事情。我感谢你能提供的任何帮助
[编辑]添加更多信息(可能是相关信息):
所讨论的资源文件是一个名为persistence.xml
的文件。它用于连接到关系数据源。应用程序使用的文件版本位于src\main\resources\META-INF
中。Maven构建(比如战争)将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
中的文件版本无法使用。src\test\resources
目录中提供了不同的版本
由于使用了
src\main\resources
中的版本,因此我唯一的办法似乎是在单元测试期间指示Eclipselink查找不同的文件名。这根本不是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无关。您在类路径上声明了两次资源。您需要重新考虑单元测试。您可以通过配置文件来解决这个问题,但这是对构建系统的滥用。这不是一个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无关。您在类路径上声明了两次资源。您需要重新考虑单元测试。您可以通过配置文件来解决这个问题,但这是对构建系统的滥用。我回答了这个问题,然后花了一些时间试图再次解决它。 在surefire文档中,它说测试类应该是类路径中的第一个: 和surefire显示(使用mvn--debug选项): [调试]测试类路径:
…\target\test classes
…\target\classes ..m2\repository\javax\enterprise\cdi api\1.2\cdi-api-1.2.jar
..…m2\repository\javax\el\javax.el api\3.0.0\javax.el-api-3.0.0.jar ... 但它仍然首先使用target\classes。奇怪的是,这个错误是前一段时间报告的。 然后,无论我做什么,都会首先从classes文件夹中获取persistence.xml
因此,我不得不在一个persistence.xml文件中使用两个持久性单元,这可能不是最好的,但也可以很好地工作。我回答了,然后花了几分钟的时间再次尝试解决这个问题。 在surefire文档中,它说测试类应该是类路径中的第一个: 和surefire显示(使用mvn--debug选项): [调试]测试类路径:
…\target\test classes
…\target\classes ..…m2\repository\javax\enterprise\cdi api\1.2\cd