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 { // 原有测试代码保持不变 }
若替换注解后仍报错,检查测试依赖是否引入了JUnit5对应的Mockito适配包,Maven配置示例如下:@BeforeEach void initMock() { MockitoAnnotations.openMocks(this); }<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
相关产品推荐
相关产品推荐

