首页
学习
活动
专区
圈层
工具
发布

Spring @WebMvcTest with Spring Security

基础概念

@WebMvcTest 是 Spring Boot 提供的一个测试注解,用于对 Spring MVC 控制器层进行单元测试。它会自动配置 MockMvc 实例,并加载指定的控制器类及其依赖的组件,但不会加载整个 Spring 应用上下文。

Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Spring 的应用程序。

相关优势

  1. 专注控制器层测试@WebMvcTest 允许你专注于控制器层的测试,而不必加载整个应用上下文,从而提高测试速度。
  2. MockMvc 支持:通过 MockMvc,你可以模拟 HTTP 请求并验证响应,而无需实际启动服务器。
  3. 与 Spring Security 集成:结合 Spring Security,你可以轻松测试安全相关的功能,如身份验证和授权。

类型

@WebMvcTest 主要有以下几种类型:

  • 默认情况下,只加载控制器类及其直接依赖。
  • 通过 excludeFiltersincludeFilters 属性,可以进一步自定义要加载或排除的组件。
  • 可以与 @MockBean@SpyBean 注解结合使用,以模拟或监视其他 Spring Bean。

应用场景

当你需要测试以下场景时,可以使用 @WebMvcTest

  1. 验证控制器的响应是否符合预期。
  2. 测试控制器与 Spring Security 的集成,如验证用户权限。
  3. 在不启动整个应用的情况下,模拟各种 HTTP 请求和响应。

遇到的问题及解决方法

问题:@WebMvcTest 无法加载 Spring Security 配置

原因@WebMvcTest 默认不会加载整个 Spring 应用上下文,因此可能无法找到 Spring Security 的配置。

解决方法

  1. 使用 @Import 注解显式导入 Spring Security 配置类。
  2. 在测试类上使用 @ContextConfiguration 注解,并指定 Spring Security 配置类的位置。
代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
@Import(SecurityConfig.class) // 导入 Spring Security 配置类
public class MyControllerTest {
    // ...
}

或者

代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
@ContextConfiguration(classes = {MyController.class, SecurityConfig.class})
public class MyControllerTest {
    // ...
}

问题:MockMvc 请求被 Spring Security 拦截

原因:Spring Security 可能会拦截 MockMvc 发出的请求,并根据安全配置进行身份验证或授权。

解决方法

  1. 在测试方法上使用 @WithMockUser 注解,模拟一个已认证的用户。
  2. 配置 Spring Security 允许匿名访问测试所需的 URL。
代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser(username = "test", roles = "USER")
    public void testMyController() throws Exception {
        mockMvc.perform(get("/my-endpoint"))
                .andExpect(status().isOk());
    }
}

或者在 Spring Security 配置中添加允许匿名访问的规则:

代码语言:txt
复制
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/my-endpoint").permitAll() // 允许匿名访问 /my-endpoint
            .anyRequest().authenticated();
    }
}

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

31秒

我用了505天,写了24万字的Spring Security教程

6分16秒

95-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security概述

6分10秒

96-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security入门

3分7秒

102-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户认证(功能测试)

3分35秒

103-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户授权(实现分析)

3分39秒

106-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户授权(异常处理)

10分8秒

97-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户认证(流程概述)

5分6秒

98-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户认证(实现分析)

16分19秒

「Spring认证」如何开始学习Spring?

1.2K
11分59秒

100-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户认证(功能实现中)

5分45秒

101-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户认证(功能实现下)

10分35秒

104-尚硅谷-硅谷通用权限项目-权限管理模块-Spring Security用户授权(功能实现上)

领券