单元测试无法读取src/test/resources文件的原因排查
问题描述
我在路径src/main/java/package/Myclass.java的工具类中有如下方法:
public static void dummymethod(String file1, String file2) { …. try (InputStream xsdStream = XMLValidator.class.getClassLoader().getResourceAsStream(file1)) { // do something with file2 …. } }…. }
该方法运行时读取src/main/resources下的文件,但编写的单元测试(路径为src/test/java/util/MyLoginTest.java)调用此方法时,仍尝试读取src/main/resources的文件,而非预期的src/test/resources下的文件,导致测试无法找到目标文件。
项目结构如下:
my-project ├── src │ ├── main │ │ ├── java │ │ │ └── package │ │ │ └── Myclass.java // 包含dummymethod方法 │ │ └── resources │ │ ├── file.json // 生产环境资源文件 │ │ └── file2.json // 另一个生产环境资源文件 │ └── test │ ├── java │ │ └── util │ │ ├── MyLoginTest.java // 包含testValidFile测试方法 │ │ └── OtherTest.java // 其他测试类(如有需要) │ └── resources │ ├── file.json // 测试环境资源文件 │ └── file2.json // 另一个测试环境资源文件
问题原因
- 类加载器的资源查找逻辑限制:你通过
XMLValidator.class.getClassLoader()获取的是加载生产代码的类加载器,它默认优先扫描src/main/resources对应的输出目录(target/classes)。在部分测试运行环境中,这个类加载器不会优先扫描测试资源的输出目录(target/test-classes),导致同名资源只会读取到main目录下的版本。 - 类路径顺序配置异常:Maven、Gradle等构建工具默认会把测试资源目录的类路径优先级设为高于生产资源目录,但如果你的项目构建配置被修改过,调整了类路径的加载顺序,就会出现生产资源被优先加载的情况。
- 测试资源未正确构建输出:如果构建工具在执行测试前,没有把
src/test/resources下的文件复制到target/test-classes目录,测试运行时就找不到测试资源,只能读取target/classes里的生产资源文件。
内容的提问来源于stack exchange,提问作者Maria Rona
相关产品推荐
相关产品推荐

