Java Spring中@InjectMocks在服务测试用例中返回null的解决方法
解决StudentCourseRequestService测试中的NullPointerException问题
问题原因
测试类使用了@MockBean注解,但未启用Mockito的注解处理机制,导致courseRequestRepository这个Mock对象没有被正确创建并注入到studentCourseRequestService中,调用方法时触发空指针异常。
修复步骤
1. 调整注解并添加Mockito扩展支持
- 将
@MockBean替换为Mockito原生的@Mock注解:@MockBean是Spring Boot用于集成测试时替换容器内Bean的注解,而单元测试无需加载Spring上下文,使用@Mock即可创建Mock对象。 - 在测试类上添加
@ExtendWith(MockitoExtension.class):让JUnit 5能够识别并初始化Mockito的注解对象,完成依赖注入。
2. 确认依赖完整性
如果使用Maven,确保pom.xml中包含Mockito的JUnit 5依赖:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.5.1</version> <!-- 可替换为最新稳定版本 --> <scope>test</scope> </dependency>
修改后的测试类代码
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import model.CourseRequest; import repository.ICourseRequestRepository; @ExtendWith(MockitoExtension.class) public class StudentCourseRequestServiceTests { @Mock private ICourseRequestRepository courseRequestRepository; @InjectMocks private StudentCourseRequestService studentCourseRequestService; @Test public void requestValidCourse() throws Exception { final CourseRequest courseRequest = new CourseRequest( "data0", "data1", "data2", "data3", "data4", "data5" ); when(courseRequestRepository.saveRequest(courseRequest)).thenReturn(true); boolean result = studentCourseRequestService.requestCourse(courseRequest); assertThat(result).isTrue(); } }
额外说明
@InjectMocks会自动将标注@Mock的对象注入到被测试类的对应字段中,这里就是把courseRequestRepository注入到studentCourseRequestService实例里。- 若必须使用
@MockBean(如需要加载部分Spring上下文的集成测试场景),需给测试类添加@SpringBootTest注解,但该方式会减慢测试执行速度,单元测试不推荐。
内容的提问来源于stack exchange,提问作者Yağız Can Aslan
相关产品推荐
相关产品推荐

