在@WebMvcTest中排除Spring Boot应用导入的配置
解决@WebMvcTest加载主类导入配置的问题
针对这个场景,这里有几个可行的解决办法:
方法一:精准排除指定配置类
在@WebMvcTest中通过excludeFilters直接排除不需要加载的FooConfiguration和BarConfiguration,示例代码如下:
@WebMvcTest(controllers = YourTargetRestController.class, excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = FooConfiguration.class), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = BarConfiguration.class) }) public class YourRestControllerTest { // 测试逻辑 }
这种方式直接针对目标配置类过滤,不会影响WebMvc测试必需的组件加载。
方法二:自定义测试专用Spring Boot配置
在测试类上添加@SpringBootConfiguration,让@WebMvcTest优先使用这个测试类的配置,而非主类的配置,这样就不会加载主类中@Import的内容:
@WebMvcTest(YourTargetRestController.class) @SpringBootConfiguration public class YourRestControllerTest { // 测试逻辑 }
这个方案相当于给测试搭建了极简的Spring Boot上下文,只加载WebMvc测试必要组件和指定控制器。
方法三:给主类导入配置加环境条件判断
如果希望主类的配置在WebMvc测试环境下自动失效,可以给@Import的配置类添加条件注解。先自定义一个判断环境的条件类:
public class NotWebMvcTestCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { ClassLoader classLoader = context.getClassLoader(); try { // 能加载到WebMvcTest类,说明是测试环境,返回false不加载配置 classLoader.loadClass("org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest"); return false; } catch (ClassNotFoundException e) { // 非测试环境,返回true加载配置 return true; } } }
然后修改主类的@Import配置:
@SpringBootApplication @Import({ @Conditional(NotWebMvcTestCondition.class) FooConfiguration.class, @Conditional(NotWebMvcTestCondition.class) BarConfiguration.class }) public class YourMainSpringBootApplication { ... }
这个方案适合全局控制配置加载规则,无需每个测试类单独配置。
内容的提问来源于stack exchange,提问作者amsalk
相关产品推荐
相关产品推荐

