如何在Java单元测试中获取src目录下的资源文件引用?
解决单元测试中访问src/test/resources目录下文件的问题
你遇到的核心问题是:类加载器(class.getResource)只能访问类路径内的资源,也就是编译后target/test-classes里的文件,而src/test/resources属于源码目录,不在类路径中,所以不能通过类加载器获取,得直接用文件系统路径访问。下面是几个可行的方案:
直接使用项目根相对路径构建File对象
单元测试运行时的工作目录默认是项目根目录,所以可以直接写相对路径指向src下的文件:File srcFile = new File("src/test/resources/expected/file.json");这种方式简单直接,只要测试运行时工作目录没被修改就有效。
通过系统属性获取项目根路径(更稳妥)
用System.getProperty("user.dir")获取当前工作目录(即项目根),再拼接目标文件路径:String projectRoot = System.getProperty("user.dir"); File srcFile = new File(projectRoot + "/src/test/resources/expected/file.json");这个方法能避免工作目录变化带来的问题,兼容性更好。
如果用Maven,通过构建变量绑定项目根目录
先在pom.xml的surefire插件中配置系统变量,把项目根目录传递到测试中:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> <project.basedir>${project.basedir}</project.basedir> </systemPropertyVariables> </configuration> </plugin> </plugins> </build>然后在测试代码中通过这个变量获取文件:
String projectRoot = System.getProperty("project.basedir"); File srcFile = new File(projectRoot + "/src/test/resources/expected/file.json");这种方式适合需要严格控制路径的场景。
注意:修改src/test/resources下的文件后,下次构建时Maven/Gradle会重新把这些文件复制到target/test-classes,所以如果需要同步更新类路径里的文件,可能需要触发一次资源复制操作(比如Maven执行process-test-resources目标)。
内容的提问来源于stack exchange,提问作者Vayas Zsolt Marton
相关产品推荐
相关产品推荐

