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

