You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:22:40