@MockitoBean
多年来,@MockBean 一直被广泛用于 Spring Boot 单元测试中来模拟依赖项。
然而,在 Spring Boot 3.2 中,@MockBean 由于性能和可维护性方面的问题已被标记为废弃。
✔ 创建不必要的 Spring 上下文代理 → 拖慢测试执行速度 ✔ 全局模拟 Bean → 可能在多个测试中产生副作用 ✔ 未针对 Spring Boot 3.2 的测试改进进行优化
@MockitoBean 是 Spring 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、@RestControllerAdvice及WebMvcConfigurer,便于测试全局异常处理和配置 。
基本用法示例
@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"));
}
}