我的 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 客户端的必要信息。
我能够使用以下测试配置成功运行您的确切
@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();
}
}
将此注释添加到测试类会有所帮助:@AutoConfigureWebTestClient
这对我有用:
private WebTestClient webTestClient;
@Autowired
public void setWebApplicationContext(final WebApplicationContext context) {
webTestClient = MockMvcWebTestClient
.bindToApplicationContext(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
然后在测试中使用
@WithMockUser
注释。