处理Eclipse和maven中的路径

时间:2014-08-27 09:34:38

标签: spring maven spring-test maven-surefire-plugin

我有一个多模块maven项目(ModuleA,ModuleB,ModuleC)

我在ModuleA中进行了测试

@ContextConfiguration(locations = 
           { "file:../ModuleB/src/test/resources/application-context-test.xml",
             "classpath:/mvc-dispatcher-servlet-test.xml"
           })

从ModuleB中的文件加载上下文。

当我在eclipse中运行测试时,它可以工作。但是当测试由maven运行时不会。

在eclipse中,currentpath设置为ModuleA,但在maven中,它设置在父文件夹中。

所以我应该写:

  

文件: /ModuleB/src/test/resources/application-context-test.xml

的内容
  

文件: .. /ModuleB/src/test/resources/application-context-test.xml

让它在maven中运行(但它会破坏日食)

谢谢!

如何告诉maven(或surefire插件)相对于模块路径而不是父路径运行单元测试?

3 个答案:

答案 0 :(得分:1)

${project.basedir}/src/test/resources中的文件被复制到${project.build.testOutputDirectory},默认为'target / test-classes'。 Maven作为generate-testResources阶段的一部分自动执行此操作。

因此,您不希望在/ src / test / resources目录中查找该文件,因为它不在类路径中。如果您在ModuleB中有一个测试来查找该文件,您可以这样写:

@ContextConfiguration(locations = 
       { "classpath:/application-context-test.xml",
         "classpath:/mvc-dispatcher-servlet-test.xml"
       })

您遇到的困难是您想要的文件存在于另一个项目中。所以您要解决的问题是,如何将其他项目的资源放到此项目的类路径中?你可以做以下两件事之一来解决这个问题:

一:执行ModuleB中的maven jar plugin's test-jar goal。这将获取ModuleB的target/test-classes目录中的所有类和资源,并将其打包到jar中。然后,您可以将测试jar作为依赖项添加到模块A的POM中,如下所示:

 <dependency>
     <groupId>com.mycompany.theGroupId</groupId>
     <artifactId>moduleB</artifactId>
     <version>yourVersion</version>
     <type>test-jar</type>
    <scope>test</scope>
 </dependency>

二:您可以将模块B的测试资源移动到一个单独的项目中(在目录newProject/src/main/resources中),让Maven像往常一样构建jar,并让ModuleA和ModuleB添加newProject作为范围{{1的依赖项}}

答案 1 :(得分:0)

添加此而不是正斜杠 - "classpath:application-context-test.xml"

Maven会自动从资源中提取

答案 2 :(得分:0)

无论什么是什么,这都不是最好的实践。

请执行以下操作:

首先,确保模块A是否依赖模块B? (我猜是的)

如果是,请使用classpath:/application-context-test.xml,然后使用父目录下的mvn install打包模块B并进行安装。那么,你可以运行测试用例,它应该可行。

如果没有,请将application-context-test.xml复制到模块A中,但我认为这很奇怪。通常,如果你想使用其他模块的文件,那是因为这个模块依赖它。