Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试时无法让Maven(和Eclipse)使用测试资源_Java_Eclipse_Unit Testing_Maven - Fatal编程技术网

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的帖子,例如:

然而,这个基本问题让我感到困惑

我建立了一个非常标准的Maven Java项目:

  • src\main下的应用程序源和资源
  • src\Test
Eclipse(得益于M2Eclipse插件)在其构建路径中拥有
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