角色授权测试返回错误状态码:公共接口测试遇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。
你可以通过两种方式解决:
- 移除
@MockitoBean注解的JwtAuthFilter,让Spring加载真实的过滤器配置,确保测试环境中过滤器能正确识别公开接口。 - 给模拟的
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
相关产品推荐
相关产品推荐

