我正在开发一个多模块maven Java EE项目。我们使用Spring为每个模块分别配置。我们在src / test / integration文件夹中放置了集成测试以及相应模块的UT(比如在src / test / ut中)。
当执行模块B的集成测试时,我们需要首先对模块B所依赖的模块A执行一些清理/初始化。这意味着:我们需要在执行模块B的测试时访问模块A的测试数据。我为模块A的集成测试建立了模块B集成测试的依赖关系,其范围为=" test"。然后构建模块-A-test.jar并将其部署在本地存储库中。
当执行模块B的测试时,初始化测试运行器,并在类路径上找到两个模块的application-context.xml。请注意,模块A的application-context.xml位于module-A-test.jar中,因此jar位于类路径上。
模块-A-test.jar的结构是:
module-A-test.jar
|- sqlFile
| |-clean-module-A.sql
| |-some other sql scripts
|-module-A-db.properties
|-module-A-db-config.xml
|-module-A-IT-config.xml
模块-B的目标文件夹的结构是:
classes
|- all module clases as expected
surefire-reports
|- test result reports
test-classes
|- test classes
|- sqlFile
| |-clean-module-B.sql
| |-some more sql scripts
|-module-B-db.properties
|-module-B-db-config.xml
|-module-B-IT-config.xml
我读到maven测试生命周期类路径是从这些来源构建的:
- The test-classes directory
- The classes directory
- The project dependencies
- Additional classpath elements
从那以后我希望能够读取clean-module-A.sql和clean-module-B.sql。 然而,当我运行代码片段时,找不到文件(即使对于模块B),我跳出了ITException。同样适用于clean-module-A.sql。
StringBuilder path = new StringBuilder();
path.append("sqlFile/");
path.append("clean-module-B.sql");
File file = new File(path.toString());
if (!file.exists()) {
throw new ITException("File " + file.getPath().toString() + " does not exist");
}
我希望我能正确而清楚地描述这种情况。
现在最后问题: 为什么我能够在claspath上看到module-B-IT-config.xml(甚至是module-A-IT-config.xml)而不是sql资源?
非常感谢您的任何想法!
帕夫林
答案 0 :(得分:0)
您遇到的问题是您要查找的文件位于jar中(当您从IDE运行测试时,文件直接位于文件系统上)。
Spring正在加载应用程序上下文文件,方法是查看类路径并打开一个流来读取它们。
你必须这样做。就像这样:
ModuleATestClass.class.getResourceAsStream("/sqlFile/clean-module-A.sql")