Spring @Value注入测试与主资源:为何测试环境仅识别测试目录资源?
问题分析与解决方案
为什么单元测试只能读到src/test/resources的文件?
这个问题我之前也碰到过,核心原因其实是Spring资源加载的前缀逻辑差异,再加上测试环境的类路径优先级影响:
- 你当前用的是
classpath:xyz/*.xyz.xml,classpath:前缀的逻辑是只在当前类加载器的第一个匹配类路径位置中查找资源。 - 在Spring Boot单元测试场景下,Maven/Gradle默认会把
src/test/resources放在类路径的更靠前位置。当Spring扫描时,会优先从这里找到匹配的XML文件,然后就停止扫描其他类路径位置了,自然读不到src/main/resources下的对应文件。 - 哪怕
src/main/resources也在类路径中,classpath:的通配符扫描不会遍历所有类路径节点,只会取第一个匹配的位置。
如何同时读取两个目录下的文件?
解决方法非常直接,只需要把资源路径的前缀改成classpath*:即可:
@Value("classpath*:xyz/*.xyz.xml") private Resource[] xyzResources;
classpath*:前缀的作用是遍历所有类路径中的位置(包括src/main/resources、src/test/resources,甚至依赖JAR包中的资源目录),找到所有匹配通配符的文件并返回。
额外注意事项
- 如果
src/main/resources和src/test/resources下存在同名的XML文件,测试环境中src/test/resources的文件会覆盖src/main/resources的,这是Maven/Gradle测试类路径的优先级决定的,属于正常现象。 - 若需要递归扫描
xyz目录下的所有子目录,可以把通配符改成xyz/**/*.xyz.xml。
内容的提问来源于stack exchange,提问作者Steffen Harbich
相关产品推荐
相关产品推荐

