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
相关产品推荐
相关产品推荐

