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

Kotlin Gradle测试代码无法读取test资源目录下的CSV文件

解决Gradle Kotlin项目测试读取resources文件的问题

你的核心问题是直接用File类读取资源路径的方式不适合Gradle项目的资源加载规则,Gradle构建时会将src/test/resources下的文件复制到测试类的classpath根目录,而非保留原目录结构,所以不能用相对路径或硬编码绝对路径来读取。

正确的解决方案:通过类加载器读取资源流

这是跨IDE、跨构建环境的通用方式,不管是在IntelliJ中运行测试,还是用Gradle命令行执行,都能正常工作。

1. 修改csvOpen函数

替换原来直接操作File的逻辑,改用类加载器获取资源流:

fun csvOpen(csvResourcePath: String, columnIndex: Int): Sequence<Double> {
    // 通过线程上下文类加载器获取资源流
    return Thread.currentThread().contextClassLoader.getResourceAsStream(csvResourcePath)
        ?.bufferedReader()
        ?.useLines { lines ->
            lines.drop(1) // 跳过表头
                .map { it.split(",")[columnIndex].toDouble() }
        } ?: throw IllegalArgumentException("找不到资源文件:$csvResourcePath")
}

2. 调整测试类的调用路径

因为output.csv在编译后会被放到classpath根目录,所以直接传入文件名即可:

class Tov {
    @Test
    fun `Fermi Gas Equations With Inverse EOS`() {
        csvOpen("output.csv", 3).forEach {
            println(it)
        }
    }
}

额外检查项

  • 确认src/test/resources目录在IntelliJ中被标记为Test Resources Root:右键该目录 → Mark Directory as → Test Resources Root(Gradle项目通常会自动配置,但如果没生效需要手动设置)。
  • 验证资源文件是否被正确复制到构建目录:执行./gradlew test后,查看build/resources/test目录下是否存在output.csv。

为什么原来的方式不行?

  • 你用的resources/output.csv是相对于项目根目录的路径,但Gradle测试运行时,src/test/resources下的文件并不会保留resources这个父目录层级。
  • 硬编码绝对路径(比如~/src/main/test/resources/output.csv)完全不可靠,不同机器的项目路径、用户目录都可能不同,而且打包后路径会彻底失效。

内容的提问来源于stack exchange,提问作者Kid A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:03:24