You need to enable JavaScript to run this app. STS中JUnit测试读取src/test/resources下资源出现getResource返回null的问题
优惠活动
大模型
产品
解决方案
定价
更多

STS中JUnit测试读取src/test/resources下资源出现getResource返回null的问题

测试资源加载失败的解决方法

核心原因

你遇到的getResource返回null,本质就是测试运行时的类加载器的搜索路径里,根本没有包含存放json文件的src/test/resources目录,手动修改运行配置的方式没有解决根本问题,还可能引入新的类路径冲突。

具体排查和修复步骤

  • 先确认资源目录被构建工具正确识别
    手动新建的src/test/resources目录,不会被IDE或Maven/Gradle自动标记为资源根目录,需要手动触发识别:
    如果你用IDEA做开发,直接右键src/test/resources文件夹,选择「将目录标记为」→「测试资源根」,标记成功后这个文件夹会变成绿色的测试资源标识,IDE就会自动把目录下的文件拷贝到测试运行的类路径输出目录(比如target/test-classes)。
    如果你用Maven项目,确认pom.xml没有覆盖默认的测试资源配置,默认Maven会自动把src/test/resources加入测试类路径,不需要额外配置;如果你用Gradle项目,检查build.gradle里的sourceSets,确认test任务的资源源目录指向src/test/resources。
    验证方式:随便跑一次测试后,去项目编译输出目录(target/test-classes或build/resources/test)下,看能不能找到jsons/server_request.json文件,如果找不到,说明目录根本没被识别,类加载器自然搜不到资源。
  • 修正工具类的资源加载逻辑
    原来的代码用ClassLoader.getSystemClassLoader()获取系统类加载器、再把资源URL转成本地File的写法,在测试场景下有两个天生的缺陷:
    1. 测试运行时的类加载通常是隔离的,系统类加载器的搜索路径里经常不包含测试资源目录,很容易出现返回null的情况
    2. 如果后续项目打包成jar运行测试,资源是在jar包内部的,根本没有对应的本地File路径,转File的操作直接就会报错
      直接换成流读取的方式,绕开File转换的逻辑,同时用当前类的类加载器加载资源:
    public class CommonTestUtility {
        public static String getFileAsString(String fileName) throws IOException {
            // 从类路径根目录开始匹配资源路径
            try (InputStream resourceStream = CommonTestUtility.class.getResourceAsStream("/" + fileName)) {
                if (resourceStream == null) {
                    throw new FileNotFoundException("未找到类路径下的资源: " + fileName);
                }
                // 统一用UTF-8编码读取,避免乱码
                return new String(resourceStream.readAllBytes(), StandardCharsets.UTF_8);
            }
        }
    }
    
    你传的参数jsons/server_request.json和resources目录下的文件层级完全匹配,不需要调整调用的传参。
  • 撤回之前手动修改的JUnit运行配置
    手动在JUnit运行配置里加src/test/resources路径的操作,会和构建工具自动生成的类路径产生顺序冲突,反而会让资源加载不稳定。把之前加的自定义路径全部删掉,重新同步一次项目的Maven/Gradle配置,让构建工具自动管理测试类路径就行。
  • 排查路径大小写问题
    确认实际的文件夹和文件名和你代码里写的完全一致:比如不要把jsons写成Json、Jsons,不要把server_request.json写成Server_Request.json,Windows环境下虽然不区分大小写,但后续打包到Linux环境跑CI测试的时候,严格的大小写匹配会直接导致资源找不到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 06:06:03