1

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

我做了相当多的研究,查看了 StackOverflow 的帖子,例如:

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

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

  • 应用程序源和资源下src\main
  • 测试源和资源下src\test

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

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

即使我要掩饰我无法从 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不能使用文件的版本。目录中提供了不同的版本src\test\resources

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

4

2 回答 2

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 无关。您在类路径上声明了两次资源。你需要重新考虑你的单元测试。您可以通过 Profiles 做一些事情来解决这个问题,但这是对构建系统的滥用。

于 2012-07-01T12:37:33.853 回答
0

我回答了,然后不得不花了一些时间试图再次弄清楚。在surefire文档中,它说测试类应该在类路径中首先出现: http ://maven.apache.org/surefire/maven-surefire-plugin/examples/configuring-classpath.html

并且肯定会显示(使用 mvn --debug 选项): [DEBUG] test classpath:
...\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 ...但它仍然使用目标\类第一。奇怪的是,这个错误是前段时间报告的。然后无论我做什么,classes 文件夹中的persistence.xml 都会被首先获取。

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

于 2014-06-19T13:14:07.773 回答