Java中如何读取test/resources目录下的资源文件(无需移动至main/resources)
核心报错原因
你当前写法报错有两个核心原因:
src/test/resources目录默认仅被测试类路径包含,main代码运行时默认不会加载该目录下的资源ResourceUtils.getFile仅能读取文件系统中的实体文件,无法读取jar包内的类路径资源,即使资源在类路径中,打包成jar后运行也会抛出异常
可选解决方案
方案1:工具类仅在测试流程调用(最适配场景,你读取的是SIT测试用feature文件,通常仅在测试环节使用)
测试执行时类路径默认已包含src/test/resources,优先替换为读输入流的写法,兼容文件系统和jar包两种场景:
import org.springframework.core.io.ClassPathResource; import java.io.InputStream; // 读取资源流,可按需转成字符串或临时文件使用 InputStream inputStream = new ClassPathResource("features/SIT/test.feature").getInputStream();
如果必须获取File对象且仅在本地测试环境运行,可修改构建配置将指定测试资源加入main资源打包范围:
- Maven配置(pom.xml的build节点下添加):
<resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/test/resources</directory> <includes> <include>features/SIT/test.feature</include> </includes> </resource> </resources>
- Gradle配置(build.gradle中添加):
sourceSets { main { resources { srcDir 'src/test/resources' include 'features/SIT/test.feature' } } }
方案2:生产环境需调用工具类读取该文件
如果生产运行时也要使用该文件,可使用绝对路径读取,不依赖类路径:
import java.io.File; // 建议将路径写入配置文件,避免硬编码适配不同环境 File file = new File("/自定义的文件存放绝对路径/features/SIT/test.feature");
注意:该方式需要提前将测试资源文件放到对应路径下,跨环境部署时需要同步调整路径配置
方案3:本地开发场景用相对路径读取
仅适合本地开发调试使用,无需修改构建配置:
import java.io.File; // 运行时工作目录需设置为项目根路径 File file = new File("test/resources/features/SIT/test.feature");
注意:IDEA运行时可在运行配置的Working directory项设置为项目根路径保证相对路径生效
内容的提问来源于stack exchange,提问作者Minisha
相关产品推荐
相关产品推荐

