用 @WebMvcTest + @Import(UserServiceImpl.class) 的组合,Spring 容器只加载你显式指定的部分内容,不会像 @SpringBootTest 那样把整个应用都拉起来。
🔍 来具体拆解一下:
🌱
@WebMvcTest(UserController.class)
-
只加载 UserController 和 MVC 相关的组件(如 @ControllerAdvice, HandlerMethodArgumentResolver, Converter 等)
-
不会自动加载 UserServiceImpl、UserMapper、UserRepository 等 Bean
➕
@Import(UserServiceImpl.class)
-
显式让 Spring 把 UserServiceImpl 加入到 Spring 容器中(其他 Service 不会被加载)
💡
@MockBean(UserMapper.class)
-
把 UserMapper 加入 Spring 容器,同时是一个 mock 对象(Mockito 创建)
-
覆盖掉真实实现(如果它存在的话)
✅ 举个例子:
你项目里结构如下:
com.example
├── controller
│ ├── UserController
│ ├── OrderController
├── service
│ ├── UserServiceImpl
│ ├── OrderServiceImpl
├── mapper
│ ├── UserMapper
│ ├── OrderMapper
现在你写测试代码:
@WebMvcTest(UserController.class)
@Import(UserServiceImpl.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserMapper userMapper;
}
👉 只会加载这些组件:
|
Bean |
来源 |
是否注入 |
|---|---|---|
|
UserController |
@WebMvcTest |
✅ |
|
UserServiceImpl |
@Import |
✅ |
|
UserMapper |
@MockBean |
✅(Mock) |
|
OrderController |
无 |
❌ |
|
OrderServiceImpl |
无 |
❌ |
|
OrderMapper |
无 |
❌ |
🧠 总结一句话:
@WebMvcTest + @Import 是精准打包测试 Controller + 指定 Service 的轻量测试方式,不会加载全项目 Bean,只加载你明示的那几个,因此启动更快,更适合组件级测试。
如果你需要测试多个 Controller 或多个 Service,也可以这样:
@WebMvcTest({UserController.class, OrderController.class})
@Import({UserServiceImpl.class, OrderServiceImpl.class})
public class MultiControllerTest {
...
}
需要我帮你把你目前的 UserControllerTest 完整写成一个结构清晰的版本吗?
浙公网安备 33010602011771号