You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:04