我有一个多模块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插件)相对于模块路径而不是父路径运行单元测试?
答案 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中,但我认为这很奇怪。通常,如果你想使用其他模块的文件,那是因为这个模块依赖它。