@MockitoBean

多年来,@MockBean 一直被广泛用于 Spring Boot 单元测试中来模拟依赖项。

然而,在 Spring Boot 3.2 中,@MockBean 由于性能和可维护性方面的问题已被标记为废弃

创建不必要的 Spring 上下文代理 → 拖慢测试执行速度 ✔ 全局模拟 Bean → 可能在多个测试中产生副作用 ✔ 未针对 Spring Boot 3.2 的测试改进进行优化

@MockitoBeanSpring Boot 3.2 中的一个新注解,它是 @MockBean直接替代品

✔ 它为依赖项创建模拟实例 ✔ 它与 JUnit 5 和 Mockito 有更好的集成 ✔ 它不需要完整的 Spring 上下文重新加载

@SpringBootTest
class UserServiceTest {

    @MockitoBean 
    private UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Test
    void testGetUserById() {
        User mockUser = new User(1L, "张三");

        Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));

        User result = userService.getUserById(1L);
        assertEquals("张三", result.getName());
    }
}

@WebMvcTest

@WebMvcTest 是 Spring Boot 提供的‌测试切片(Test Slice)注解‌,专门用于‌仅加载 Web MVC 相关组件‌来测试 Controller 层,无需启动完整应用上下文,显著提升测试速度并实现层间隔离 。‌‌

核心特性

  • 轻量加载‌:只自动配置 DispatcherServlet、RequestMappingHandlerMapping 等 MVC 基础设施,‌不加载‌ Service、Repository 等业务层 Bean 。

  • 自动 Mock‌:被测试 Controller 依赖的 Service/Repository 等 Bean 不会实例化,需配合 @MockBean 手动模拟其行为 。

  • 内置工具‌:自动注入 ‌MockMvc‌ 实例,支持在不启动真实服务器的情况下模拟 HTTP 请求并验证响应 。

  • 自动扫描‌:默认加载所有 @ControllerAdvice@RestControllerAdviceWebMvcConfigurer,便于测试全局异常处理和配置 。‌‌

基本用法示例

@WebMvcTest(UserController.class) // 指定仅测试该 Controller
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean // 模拟 Service 层依赖
    private UserService userService;

    @Test
    void testGetUser() throws Exception {
        // 定义 Mock 行为
        when(userService.findById(1L)).thenReturn(new User("test"));

        // 发起请求并验证
        mockMvc.perform(get("/api/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("test"));
    }
}