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

Spring Boot单元测试无法Mock JPARepository报空指针问题

问题排查与解决方法

你遇到的空指针问题核心原因是Mockito注解未生效,@Mock声明的对象没有被初始化,按优先级排查以下点即可解决:

1. JUnit版本与Mockito注解不匹配(最常见原因)

你当前用的@RunWith(MockitoJUnitRunner.class)是JUnit4的专属注解,如果你的项目用的是JUnit5(Jupiter),该注解完全不会生效,@Mock、@InjectMocks都不会被解析,自然会出现空指针。

  • 适配JUnit5的解决方法:
    替换测试类的运行器注解为JUnit5适配的Mockito扩展:
    import org.mockito.junit.jupiter.MockitoExtension;
    import org.junit.jupiter.api.extension.ExtendWith;
    
    @ExtendWith(MockitoExtension.class)
    class AdminServiceTest {
      // 原有测试代码保持不变
    }
    
    如果不想用扩展注解,也可以通过手动初始化的方式触发注解解析:
    @BeforeEach
    void initMock() {
        MockitoAnnotations.openMocks(this);
    }
    
    若替换注解后仍报错,检查测试依赖是否引入了JUnit5对应的Mockito适配包,Maven配置示例如下:
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-junit-jupiter</artifactId>
        <version>与项目内mockito-core版本一致</version>
        <scope>test</scope>
    </dependency>
    
  • 如果你用的是JUnit4:
    需要把测试类、测试方法都声明为public,同时确认@Test注解导入的是org.junit.Test包,不是JUnit5的org.junit.jupiter.api.Test。

2. 额外问题提示(不影响本次空指针,但后续运行会报错)

你的AdminRepository继承的CrudRepository<Admin, String>第二个泛型参数为主键类型,你声明的是String,但自定义方法deleteById(long l)、findById(long l)的入参是long类型,和泛型声明的主键类型冲突,后续运行时会出现类型不匹配错误,需要统一主键类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:03