我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用 @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 完整写成一个结构清晰的版本吗?

posted on 2025-04-10 15:08  我就是奇迹  阅读(12)  评论(0)    收藏  举报