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

角色授权测试返回错误状态码:公共接口测试遇401问题

问题

我正在测试控制器的授权功能,遇到了返回状态码异常的问题。我先从一个基础的公共接口入手测试环境配置:

@WebFluxTest(controllers = {
        UserController.class
})
@AutoConfigureWebTestClient
public class UserControllerTest {

    @Autowired
    private WebTestClient webClient;

    @MockitoBean
    private UserService userService; 

    @MockitoBean
    private JwtAuthFilter jwtAuthFilter;

    @InjectMocks
    private UserController userController; 
    

    @Test
    void testCreateUser_withUserRole_shouldAllowAccess() throws Exception {

        webClient.get().uri("/users/hello")
                .exchange()
                .expectStatus().isOk()
                .expectBody(String.class)
                .isEqualTo("Hello, this is a public endpoint!");


    }
}

测试结果如下:

Expected :200 OK
Actual   :401 UNAUTHORIZED

我用Postman测试过该接口是公开的,后端启动后可以正常访问,但在测试用例中却返回401未授权,请问我哪里操作有误?

解决方案

问题出在你用@MockitoBean模拟了JwtAuthFilter,但未给这个模拟过滤器设置正确的放行逻辑。实际运行环境中,真实的JwtAuthFilter会识别公开接口并跳过授权校验,但测试里的模拟对象默认没有这个逻辑,直接拦截了请求返回401。

你可以通过两种方式解决:

  1. 移除@MockitoBean注解的JwtAuthFilter,让Spring加载真实的过滤器配置,确保测试环境中过滤器能正确识别公开接口。
  2. 给模拟的jwtAuthFilter设置放行行为,在测试类中添加初始化方法:
    @BeforeEach
    void setUp() {
        when(jwtAuthFilter.filter(any(ServerWebExchange.class), any(WebFilterChain.class)))
            .thenAnswer(invocation -> {
                WebFilterChain chain = invocation.getArgument(1);
                return chain.filter(invocation.getArgument(0));
            });
    }
    

这段代码会让模拟的过滤器直接调用后续过滤链,放行请求。

另外,@WebFluxTest会自动创建控制器实例,你添加的@InjectMocks属于多余配置,建议移除避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:38:22