【发布时间】:2012-07-01 12:31:11
【问题描述】:
我无法让单元测试使用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 的文件。 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 查找不同的文件名。
【问题讨论】:
-
我很确定您可以在 src/main/resources/META-INF/persistence.xml 中创建一个新的持久性单元,您可以在单元测试和
Persistence.createEntityManagerFactory中使用它似乎无论如何,要成为您对两个 persistence.xml 文件所做的事情。 -
同一文件中的不同持久性单元(可能)。这是一个有趣的想法。我需要弄清楚如何指示班级使用不同的持久性单元(PU)。毕竟 PU 是通过 Java 类上的注释识别的,并且(在我的情况下)是使用 Spring 连接的。感谢您的提示,我将不得不考虑一下。
标签: java eclipse unit-testing maven