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

Spring Webflux测试控制器时JwtAuthenticationToken为空的解决方法

解决WebTestClient测试时JwtAuthenticationToken为空的问题

要解决这个空指针问题,你需要在WebTestClient的请求中注入Mock的JwtAuthenticationToken对象,替代Spring Security在实际运行时自动注入的逻辑。具体操作如下:

  • 先MockJwtAuthenticationToken及其依赖的Jwt对象,避免真实对象的初始化复杂度
  • 在WebTestClient的请求构建链中,通过principal()方法将Mock的认证对象绑定到请求上下文

修改后的测试类代码如下:

@ExtendWith(MockitoExtension.class)
public class TokenControllerTest {

    private WebTestClient webTestClient;
    // Mock需要的认证相关对象
    @Mock
    private JwtAuthenticationToken mockJwtAuthToken;
    @Mock
    private Jwt mockJwt;

    @BeforeEach
    public void setup() {
        // 定义Mock对象的方法返回行为
        when(mockJwtAuthToken.getToken()).thenReturn(mockJwt);
        when(mockJwt.getTokenValue()).thenReturn("test-token-123");
        
        webTestClient = WebTestClient.bindToController(new TokenController())
                .build();
    }

    @Test
    public void testGetTokenValueFromEndpoint() {
         webTestClient
                .get()
                .uri("/tokenService")
                // 将Mock的认证对象设置为请求的principal
                .principal(mockJwtAuthToken)
                .exchange()
                .expectStatus().isOk()
                // 验证返回的token值是否符合预期
                .expectBody(String.class).isEqualTo("test-token-123");
    }
}

补充说明

  • 使用Mockito的@Mock注解创建Mock对象,省去手动初始化复杂Spring Security认证类的麻烦
  • 通过when(...).thenReturn(...)指定Mock对象的方法返回值,确保控制器调用auth.getToken().getTokenValue()时不会触发空指针
  • principal()方法会把传入的对象绑定到请求的ServerHttpRequest的principal属性中,Spring Webflux会自动将其注入到控制器方法的JwtAuthenticationToken参数里

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:01:07