IntelliJ Idea Gradle项目中测试类读取文件的正确路径问题
解决方案:Gradle多模块项目测试类读取文件问题
问题根源
Gradle运行测试时,工作目录默认是项目根目录而非模块目录,且仅src/test/resources下的文件会被自动加入测试类路径;test根目录下的文件默认不会被打包到类路径中,直接用Path.of()搭配IntelliJ复制的相对路径会因路径基准错误或文件不在类路径而失效。
读取src/test/resources/file.txt(标准资源文件)
这类文件属于Gradle默认的测试资源,直接通过类加载器读取即可,不受工作目录影响:
import java.nio.file.Files; import java.nio.file.Path; import java.net.URL; public class TestClass { public void readFileTxt() throws Exception { // 从类路径根读取file.txt URL resourceUrl = TestClass.class.getResource("/file.txt"); Path filePath = Path.of(resourceUrl.toURI()); String content = Files.readString(filePath); System.out.println(content); } }
也可以直接用输入流简化操作:
import java.io.InputStream; import java.nio.charset.StandardCharsets; public class TestClass { public void readFileTxtStream() throws Exception { try (InputStream is = TestClass.class.getResourceAsStream("/file.txt")) { String content = new String(is.readAllBytes(), StandardCharsets.UTF_8); System.out.println(content); } } }
注意:路径开头的
/表示从类路径根开始查找,不可省略。
读取src/test/name.txt(非标准位置文件)
有两种可行方案:
方案1:规范文件位置(推荐)
直接将name.txt移动到src/test/resources目录下,之后即可用上面读取file.txt的方法读取(路径改为/name.txt)。
方案2:修改Gradle配置,将test根目录纳入资源
在utilities模块的build.gradle(或build.gradle.kts)中添加配置,让Gradle把test根目录下的非代码文件加入测试类路径:
// Groovy DSL sourceSets { test { resources { srcDirs += file("src/test") exclude "java/**" // 排除java目录,避免把测试代码当成资源打包 } } }
// Kotlin DSL sourceSets { test { resources { srcDirs.add(file("src/test")) exclude("java/**") } } }
配置完成后同步Gradle,再用类加载器读取/name.txt即可。
内容的提问来源于stack exchange,提问作者edunando
相关产品推荐
相关产品推荐

