Spring Webflux测试控制器时JwtAuthenticationToken为空的解决方法
解决WebTestClient测试时JwtAuthenticationToken为空的问题
要解决这个空指针问题,你需要在WebTestClient的请求中注入Mock的JwtAuthenticationToken对象,替代Spring Security在实际运行时自动注入的逻辑。具体操作如下:
- 先Mock
JwtAuthenticationToken及其依赖的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
相关产品推荐
相关产品推荐

