我在进行单元测试以使用 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
中的文件版本不能使用。 src\test\resources
中提供了不同版本目录。
自 src\main\resources
中的版本起正在使用中,似乎我唯一的办法是在单元测试期间指示 Eclipselink 查找不同的文件名。
最佳答案
这从根本上来说并不是 Maven 问题。如果您将所有内容都折叠到单个源文件夹中,则会遇到完全相同的问题。想想你真正在做什么。您的单元测试需要 src/main 中的代码,否则它就不是该代码的单元测试。 src/main/java 和 src/main/resources 组成了您正在测试的 Artifact 。您不会混合和匹配单元测试的目录。
你基本上是这样做的:
/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 无关。您在类路径上声明了两次资源。您需要重新考虑您的单元测试。您可以采取一些措施来使用配置文件来解决此问题,但这是对构建系统的滥用。
关于java - 测试时无法让 Maven(和 Eclipse)使用测试资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11281959/