Spring Boot 3.0.1中JUnit 5控制器单元测试依赖注入问题
控制器依赖注入与测试类修正方案
一、控制器的正确依赖注入方式
采用构造器注入,这是Spring官方推荐的方式,既支持final字段初始化,又保证依赖不可变性,同时天然适配Mockito的@InjectMocks注解:
@RestController @RequestMapping("/tasks") public class TaskController { // 用final修饰依赖,确保不可变 private final TaskService taskService; private final TaskMapper taskMapper; // Spring 4.3+ 版本可省略@Autowired,框架会自动识别唯一构造器并注入依赖 public TaskController(TaskService taskService, TaskMapper taskMapper) { this.taskService = taskService; this.taskMapper = taskMapper; } // 你的控制器业务方法... }
这种方式不需要无参构造,Spring容器和Mockito都能通过构造器完成依赖注入,从根源避免BeanInstantiationException和final字段未初始化的问题。
二、测试类的错误逐一修正
针对你提到的测试类问题,逐一修正如下:
1. 修正@InjectMocks变量名错误
变量名需与控制器类名对应(或符合常规命名),避免拼写错误:
@InjectMocks private TaskController taskController; // 替换原错误的TaskControllerTaskController
2. 修正MockMvc standaloneSetup的参数
MockMvcBuilders.standaloneSetup()需要传入控制器实例,而非Class对象:
@BeforeEach void setUp() { // 传入@InjectMocks初始化好的控制器实例 mockMvc = MockMvcBuilders.standaloneSetup(taskController).build(); }
3. 替换@SpyBean为@Spy
@SpyBean是Spring Boot Test的注解,依赖Spring容器;而@ExtendWith(MockitoExtension.class)是纯Mockito环境,不加载Spring容器,需改用Mockito原生的@Spy注解:
@Spy private TaskService taskService; // 如果需要部分mock业务逻辑时使用,纯mock用@Mock即可
修正后的完整测试类示例:
@ExtendWith(MockitoExtension.class) class TaskControllerTest { @Mock // 完全mock依赖 private TaskService taskService; @Mock private TaskMapper taskMapper; @InjectMocks // 自动将mock注入控制器实例 private TaskController taskController; private MockMvc mockMvc; @BeforeEach void setUp() { mockMvc = MockMvcBuilders.standaloneSetup(taskController).build(); } // 测试方法示例 @Test void testGetTaskById() throws Exception { // 给定mock返回值 when(taskService.getTaskById(1L)).thenReturn(new Task()); // 执行请求并验证结果 mockMvc.perform(get("/tasks/1")) .andExpect(status().isOk()); } }
三、补充说明
- 如果需要进行集成测试(加载完整Spring容器),可改用
@SpringBootTest+@AutoConfigureMockMvc,此时可以使用@SpyBean和@Autowired注入控制器,但单元测试推荐用纯Mockito方式,执行速度更快。 - 确保你的Spring Boot 3.0.1与JUnit 5、Mockito版本兼容:Spring Boot 3.x默认适配JUnit 5.9+和Mockito 4.x,无需额外调整版本依赖。
内容的提问来源于stack exchange,提问作者continuousLearner
相关产品推荐
相关产品推荐

