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

Spring Framework 5单元测试:如何在MockMvc中应用SecurityFilterChain?

解决方法

你当前用的MockitoJUnitRunner仅负责模拟对象,没法自动创建依赖HttpSecurity的SecurityFilterChain Bean——因为HttpSecurity是Spring Security上下文管理的核心类,必须通过Spring容器来实例化和注入。

直接调整测试代码,改用Spring测试框架加载上下文即可解决问题:

步骤1:更换测试运行器并加载Spring上下文

把@RunWith(MockitoJUnitRunner.class)换成@RunWith(SpringRunner.class);如果是Spring Boot项目,直接用@SpringBootTest更便捷,这样Spring会自动初始化上下文,包括创建HttpSecurity实例并注入到你的adminConsoleFilterChain Bean中。

步骤2:修改测试代码

调整后的完整测试代码示例:

@RunWith(SpringRunner.class)
@SpringBootTest // Spring Boot项目添加此注解,加载完整上下文
public class SecurityFilterChainTest {

    @Autowired
    SecurityFilterChain adminConsoleFilterChain;

    MockMvc api;

    @Before
    public void setup() {
        api = MockMvcBuilders.standaloneSetup(new AdminController())
                .apply(springSecurity(adminConsoleFilterChain.getFilters().get(0)))
                .build();
    }

    @Test
    public void givenUrlIs_x_then_is3xxRedirection() throws Exception {
        api.perform(get("/x"))
                .andExpect(status().is3xxRedirection())
                .andExpect(redirectedUrl("/admin/"));
    }
}

补充说明

  • 若项目不是Spring Boot,需在测试类上添加@ContextConfiguration注解,指定包含adminConsoleFilterChain Bean的Spring配置类路径,确保Spring能加载对应配置。
  • 用@Autowired替代@Inject(两者功能兼容,但Spring项目中@Autowired更常用),保证Spring能正确完成Bean注入。

内容的提问来源于stack exchange,提问作者mjn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:34:54