0

我正在开发一个多模块 Maven Java EE 项目。我们为每个模块使用带有单独配置的 Spring。我们将集成测试与相应模块的 UT 一起放置在 src/test/integration 文件夹中(比如说在 src/test/ut 中)。

在为模块 B 执行集成测试时,我们需要首先对模块 B 所依赖的模块 A 执行一些清理/初始化。这意味着:在执行模块 B 的测试时,我们需要访问模块 A 的测试数据。我为模块 B 集成测试设置了对模块 A 的集成测试的依赖关系,范围为“test”。然后在本地存储库中构建和部署 module-A-test.jar。

当模块 B 的测试被执行时,测试运行器被初始化,两个模块的 application-context.xml 都在类路径中找到。请注意,模块 A 的 application-context.xml 位于 module-A-test.jar 中,因此 jar 位于类路径中。

module-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 资源?

非常感谢您对它的任何想法!

帕夫林

4

1 回答 1

0

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

Spring 通过查看类路径并打开流来读取它们来加载应用程序上下文文件。

你只需要做同样的事情。即是这样的:

ModuleATestClass.class.getResourceAsStream("/sqlFile/clean-module-A.sql")
于 2013-08-23T15:14:36.983 回答