我的一个单元测试由测试数据驱动,存储在src/test/resources/testData.txt
中。由于Maven会将src/test/resources
的内容复制到类路径上的target/test-classes/
,因此我可以方便地从类路径中读取该文件,而无需关心其绝对文件名。到目前为止,非常好。
现在我正在尝试使用从远程系统获取的数据更新该文件的一些代码。该代码很少运行,而不是构建的一部分。更新的文件将提交到源存储库。为了附加到文件,我需要知道src/test/resources
中原始文件的路径(附加到target/test-classes/
中的文件显然不起作用)。
如何以便携方式确定路径?我宁愿不用硬代码src/test/resources/
,因为这些目录名实际上可能会改变。此外,如果使用除项目基目录之外的当前工作目录执行,则会中断。
有什么想法吗?
答案 0 :(得分:2)
最好的方法可能是${project.basedir}/src/test/resources
。测试资源目录不太可能更改,无论您的工作目录如何,它都将安全地解析为正确的路径。尝试通过属性引用测试资源目录是有问题的,因为可能并且通常是定义了多个测试资源。你怎么知道选哪一个?
答案 1 :(得分:0)
我首选的解决方案是配置surefire插件,以便在测试执行期间将${project.basedir}
公开为环境变量。如果需要,单元测试可以从环境中读取该信息。这样可以保留POM中的所有配置,并且如果路径发生变化则不需要更改:
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
...
<configuration>
...
<environmentVariables>
<maven.project.basedir>${project.basedir}</maven.project.basedir>
</environmentVariables>
</configuration>
</plugin>
...
</plugins>
</build>
其他解决方案可以使用资源过滤(如Ryan所建议)或配置surefire插件以将${project.basedir}/src/test/resources/
添加到类路径中来实现。