Spring Boot 1.3.1集成测试如何仅启动Web层上下文
Spring Boot 1.3.1 无@WebMvcTest时实现仅启动Web层测试的方案
@WebMvcTest的核心逻辑是仅加载Controller、ControllerAdvice、Json转换器等Web层相关组件,自动初始化MockMvc,同时排除Service、Repository、数据源等非Web层Bean,在1.3.1版本可以通过以下两种方案实现等效效果:
方案1:组合原生测试注解实现完整Web上下文隔离
该方案启动效果和高版本@WebMvcTest完全一致,会加载完整的Spring Web配置,适合需要复用项目MVC配置(比如全局拦截器、全局异常处理、消息转换器)的集成测试场景:
- 测试类使用
@WebAppConfiguration标记,指定加载WebApplicationContext而非全量根应用上下文 - 自定义测试配置类,仅扫描Controller层组件,排除非Web层的自动配置
- 所有Controller依赖的业务层组件,用Mockito生成Mock实例注入容器,等效高版本的@MockBean效果
测试类示例代码:
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = WebLayerTestConfig.class) public class UserControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void initMockMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } // 编写接口测试用例 }
对应测试配置类示例:
@Configuration @EnableWebMvc @ComponentScan( basePackages = "com.yourpackage.controller", useDefaultFilters = false, includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class) ) @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class }) public class WebLayerTestConfig { // 注册Controller依赖的Mock业务组件 @Bean public UserService userService() { return Mockito.mock(UserService.class); } }
方案2:使用Standalone模式MockMvc实现轻量测试
该方案不需要启动Spring Web上下文,手动初始化待测试的Controller实例、手动装配需要的MVC组件,启动速度最快,适合单Controller的独立测试场景:
@RunWith(MockitoJUnitRunner.class) public class UserControllerLightTest { private MockMvc mockMvc; @Mock private UserService userService; @InjectMocks private UserController userController; @Before public void initMockMvc() { mockMvc = MockMvcBuilders.standaloneSetup(userController) // 按需手动注册需要的MVC组件,比如全局异常处理器、消息转换器 .setMessageConverters(new MappingJackson2HttpMessageConverter()) .build(); } // 编写接口测试用例 }
注意:Standalone模式默认不会加载项目中全局配置的拦截器、格式化器、异常处理器等组件,需要手动注册后才能生效。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

