使用 servlet 应用程序的 WebTestClient 模拟 OAuth2 客户端会导致 httpHandlerBuilder 为 null

问题描述 投票:0回答:3

我的 Spring Boot 应用程序通过使用

spring-boot-starter-oauth2-client
依赖项充当 OAuth2 客户端。

现在我想编写一个集成测试 (

@SpringBootTest
) 来验证 OAuth2 保护的 REST 端点的行为。 测试 OAuth 2.0 客户端文档描述了可以使用
mutateWith(mockOAuth2Client())
通过 OAuth2 模拟登录。

public class UserIT {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void test() {
    webTestClient
      .mutateWith(mockOAuth2Client("keycloak"))
      .get()
      .uri("/api/user/1345")
      .exchange()
      .expectStatus().isOk();
  }
}

但是,测试失败并显示以下消息:

java.lang.NullPointerException: Cannot invoke "org.springframework.web.server.adapter.WebHttpHandlerBuilder.filters(java.util.function.Consumer)" because "httpHandlerBuilder" is null
    at org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers$OAuth2ClientMutator.afterConfigurerAdded(SecurityMockServerConfigurers.java:1113)
    at org.springframework.test.web.reactive.server.DefaultWebTestClientBuilder.apply(DefaultWebTestClientBuilder.java:265)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient.mutateWith(DefaultWebTestClient.java:167)

据我了解,这个

WebTestClient
设置仅适用于“反应式应用程序”,而我的应用程序是“Servlet应用程序”。不幸的是,我找不到如何为 servlet 应用程序模拟此 OAuth2 客户端的必要信息。

spring spring-boot spring-security
3个回答
2
投票

我能够使用以下测试配置成功运行您的确切

@Autowired
@Test
代码:

@Configuration
@ComponentScan
public class TestConfig {

    @Bean
    public WebTestClient webTestClient(ApplicationContext applicationContext) {
        return WebTestClient.bindToApplicationContext(applicationContext).build();
    }

    @Bean
    public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange().anyExchange().permitAll();
        return http.build();
    }
}

0
投票

将此注释添加到测试类会有所帮助:@AutoConfigureWebTestClient


0
投票

这对我有用:

  1. 按照下图的方式配置你自己的WebTestClient。
  2. 使用 Spring Security 测试上下文注释来模拟安全性。
private WebTestClient webTestClient; 

@Autowired
public void setWebApplicationContext(final WebApplicationContext context) { 
    webTestClient = MockMvcWebTestClient
        .bindToApplicationContext(context) 
        .apply(SecurityMockMvcConfigurers.springSecurity())
        .build();
}

然后在测试中使用

@WithMockUser
注释。
来源

© www.soinside.com 2019 - 2024. All rights reserved.