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

Spring Boot单元测试读取resources文件失败,出现空指针异常

解决Spring Boot单元测试读取src/test/resources文件时的空指针异常

嘿,我一眼就揪出问题所在啦!你碰到的空指针异常核心原因是测试资源文件的路径放错了,Gradle根本找不到这个文件,所以classLoader.getResource()返回null,调用.getFile()自然就炸了。

先搞定最关键的:修正资源文件路径

Gradle(和Maven一样)有严格的目录约定,测试资源文件应该放在src/test/resources目录下——这个目录是和src/test/java同级的,而不是你现在放的src/test/java/resources!

赶紧把test-file.json从src\test\java\resources\移动到src\test\resources\,这一步是解决问题的前提。

Gradle的标准目录结构记一下:

  • 主代码:src/main/java
  • 主资源:src/main/resources
  • 测试代码:src/test/java
  • 测试资源:src/test/resources

然后选一种可靠的方式读取文件

路径修正后,你可以用下面几种方法读取文件,都能避免空指针:

方法1:修正你原来的ClassLoader写法

@Test
public void isSortedCorrectly() throws IOException {
    ClassLoader classLoader = getClass().getClassLoader();
    URL resourceUrl = classLoader.getResource("test-file.json");
    // 加个非空判断更稳妥,避免后续踩坑
    if (resourceUrl == null) {
        throw new IllegalArgumentException("测试资源文件test-file.json不存在于类路径中");
    }
    File file = new File(resourceUrl.getFile());
    // 接下来处理你的文件逻辑
}

方法2:直接用当前类的getResource

不用ClassLoader,直接从当前类的上下文找,注意前面要加斜杠表示从类路径根目录开始:

@Test
public void isSortedCorrectly() throws IOException {
    URL resourceUrl = getClass().getResource("/test-file.json");
    if (resourceUrl == null) {
        throw new IllegalArgumentException("找不到test-file.json文件");
    }
    File file = new File(resourceUrl.getFile());
}

方法3:用Spring Boot的工具类(更推荐)

如果是Spring Boot项目,用框架提供的工具类会更稳妥,尤其是项目打包成Jar之后,直接用File可能会因为文件在Jar内部而失效,用Resource或者InputStream更靠谱:

方式A:用ResourceUtils

import org.springframework.util.ResourceUtils;

@Test
public void isSortedCorrectly() throws IOException {
    File file = ResourceUtils.getFile("classpath:test-file.json");
    // 处理文件...
}

方式B:注入ResourceLoader(适合集成测试)

如果你的测试类加了@SpringBootTest,可以注入ResourceLoader来读取资源:

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class MyUnitTest {

    @Autowired
    private ResourceLoader resourceLoader;

    @Test
    public void isSortedCorrectly() throws IOException {
        Resource resource = resourceLoader.getResource("classpath:test-file.json");
        // 用InputStream读取内容,适配Jar环境
        try (InputStream inputStream = resource.getInputStream()) {
            // 处理输入流逻辑
        }
    }
}

最后确认Gradle配置

你的build.gradle已经用了Spring Boot插件,默认会自动识别src/test/resources作为测试资源目录,不需要额外配置。要是你之前自定义过资源目录,记得确保src/test/resources被包含进去哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:15