测试代码使用restTemplate与JpaRepository时出现NullPointerException
SpringBoot集成测试NullPointerException排查方案
触发原因
依赖注入失效(占90%以上场景)
- PostsRepository未被Spring上下文识别:类未添加
@Repository注解、未继承Spring Data提供的Repository接口,或者类路径不在启动类的默认扫描范围内,无法注册为Spring Bean,最终@Autowired注入结果为null - Spring上下文加载不完整:@SpringBootTest默认会加载同包路径下的启动类,如果测试类与项目启动类不在同一包层级,且未手动指定启动类,会导致部分Bean未被加载,TestRestTemplate和PostsRepository都可能注入失败
- TestRestTemplate自动装配异常:低版本SpringBoot未默认开启TestRestTemplate的自动装配,或者项目配置文件中缺失
spring-boot-starter-test核心测试依赖,也会导致注入为空
业务变量未初始化
- 代码省略部分的
url、requestDto变量未完成赋值直接使用,调用postForEntity方法时传入null参数触发空指针
解决方法
- 先验证注入状态,在测试类中增加前置校验逻辑,确认Bean是否注入成功:
@BeforeEach void checkBeanInject() { // 两个对象都不为空才会执行测试逻辑 org.springframework.util.Assert.notNull(restTemplate, "TestRestTemplate注入失败"); org.springframework.util.Assert.notNull(postsRepository, "PostsRepository注入失败"); }
- 如果是Bean注入失败,给@SpringBootTest注解手动指定项目启动类,强制加载完整上下文:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = 你的项目启动类名.class)
- 检查PostsRepository配置:确认类上加了
@Repository注解,且继承了JpaRepository/CrudRepository等Spring Data封装的Repository接口 - 检查pom.xml/gradle.build依赖配置,确认引入了完整的测试依赖:
<!-- Maven配置示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
- 检查代码省略部分的
url、requestDto变量,确认调用postForEntity前已经完成初始化赋值,不存在null的情况 - 高版本SpringBoot可以删除
@ExtendWith(SpringExtension.class)注解,@SpringBootTest已经默认集成了该扩展能力,避免版本适配问题
内容的提问来源于stack exchange,提问作者Noeyso
相关产品推荐
相关产品推荐

