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

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());
    }
}

三、补充说明

  1. 如果需要进行集成测试(加载完整Spring容器),可改用@SpringBootTest + @AutoConfigureMockMvc,此时可以使用@SpyBean和@Autowired注入控制器,但单元测试推荐用纯Mockito方式,执行速度更快。
  2. 确保你的Spring Boot 3.0.1与JUnit 5、Mockito版本兼容:Spring Boot 3.x默认适配JUnit 5.9+和Mockito 4.x,无需额外调整版本依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:05:22