Maven在多模块集成测试类路径上找不到一些资源

时间:2013-08-23 14:26:35

标签: java xml maven module

我正在开发一个多模块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资源?

非常感谢您的任何想法!

帕夫林

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您要查找的文件位于jar中(当您从IDE运行测试时,文件直接位于文件系统上)。

Spring正在加载应用程序上下文文件,方法是查看类路径并打开一个流来读取它们。

你必须这样做。就像这样:

ModuleATestClass.class.getResourceAsStream("/sqlFile/clean-module-A.sql")