单元测试: RequestContextHolder.getRequestAttributes()获取不到 token 解决方案

本文探讨了如何在单元测试中处理接口依赖的token获取问题,通过在测试前设置SecurityContextHolder和MockHttpServletRequest头信息,模拟真实的请求环境。解决方案包括自定义UserDetailsService和使用TestingAuthenticationToken。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景


目前项目写单元测试,如果接口中使用到如下代码,是无法获取到token的

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String bearerAndtoken = request.getHeader("AUTHORIZATION")

解决方案


在单元测试中加入如下代码。 (注: token需自己通过post公司的获取token地址)

    @Before
    public void beforeMethod() {
         // xxx表示 implements UserDetailsService 的类
        UserDetails user= xxxxx.loadUserByUsername("账号");
        SecurityContextHolder.getContext().setAuthentication(
                new TestingAuthenticationToken(user, ""));
        //设置token
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return;
        }
        MockHttpServletRequest request = (MockHttpServletRequest) attributes.getRequest();
        request.addHeader("AUTHORIZATION", "Bearer " + token);
    }
在Spring框架中,`RequestContextHolder.getRequestAttributes()` 方法用于获取当前请求的 `RequestAttributes` 对象,该对象包含了请求的各种属性,包括请求头、请求参数、会话信息等。如果你无法通过该方法获取token,可能是由于以下几个原因: 1. **请求未通过Spring的DispatcherServlet**:确保你的请求是通过Spring的DispatcherServlet处理的。如果请求没有经过Spring的请求处理流程,`RequestContextHolder` 可能无法正确地获取到请求属性。 2. **异步请求**:如果你在处理异步请求时遇到问题,确保在异步线程中正确地传递了请求上下文。可以使用 `RequestContextHolder` 的静态方法来设置和获取请求属性。 3. **过滤器或拦截器未配置正确**:确保你的过滤器或拦截器正确地配置了请求上下文。过滤器或拦截器可能在请求处理之前或之后修改请求属性。 4. **线程安全问题**:如果在多线程环境中使用,确保线程安全。`RequestContextHolder` 使用 `ThreadLocal` 来存储请求属性,因此在异步线程中需要手动传递请求上下文。 以下是一个示例代码,展示如何在异步线程中传递请求上下文: ```java import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; public void asyncMethod() { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); CompletableFuture.runAsync(() -> { try { RequestContextHolder.setRequestAttributes(attributes); // 处理异步逻辑 } finally { RequestContextHolder.resetRequestAttributes(); } }); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值