使用Mockito、JUnit5和Spring Boot做服务层单元测试报NullPointerException如何解决
问题原因排查&解决方法
1. 缺少Mockito注解激活配置
JUnit 5环境下使用@Mock、@InjectMocks注解时,必须在测试类上添加@ExtendWith(MockitoExtension.class)注解激活Mockito注解处理逻辑,否则所有加了Mockito注解的字段都会保持为null,调用时直接触发空指针。
修改后的测试类头示例:
@ExtendWith(MockitoExtension.class) class UserServiceTest { // 原有字段和方法 }
2. @InjectMocks不能直接作用于接口
IUserService是服务层接口,Mockito无法直接实例化接口完成依赖注入,你需要把注入目标改成对应的实现类,比如:
@InjectMocks UserService userService; // 替换为你的IUserService实现类类名
3. 未Mock/注入UserMapper依赖
如果你的UserService实现类中依赖了UserMapper做对象转换,那么测试类中的UserMapper字段也需要添加@Mock或者@Spy注解,否则注入到Service中的UserMapper会是null,在createUser方法内调用转换逻辑时会抛出空指针。
4. 依赖缺失检查
如果加了@ExtendWith(MockitoExtension.class)后依然报错,确认你是否引入了JUnit 5对应的Mockito适配依赖:
Maven配置示例:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <scope>test</scope> </dependency>
Gradle配置示例:
testImplementation 'org.mockito:mockito-junit-jupiter'
额外注意
你当前mock userRepository.save时返回的是无参构造的空UserEntity,后续断言createdUser.getFirstName()和入参相等会失败,你需要构造一个带对应字段值的UserEntity作为返回值,或者用spy走真实处理逻辑。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

