From b0b5b1b4630d9976ef71402329ac699052ac09b1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 13 Oct 2025 14:23:01 +0200 Subject: [PATCH] Add nullability annotations to tests in module/spring-boot-security-oauth2-client See gh-47263 --- .../spring-boot-security-oauth2-client/build.gradle | 6 ++++++ .../OAuth2ClientPropertiesMapperTests.java | 11 ++++++++++- ...OAuth2ClientWebSecurityAutoConfigurationTests.java | 1 + ...OAuth2ClientWebSecurityAutoConfigurationTests.java | 6 ++++-- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/module/spring-boot-security-oauth2-client/build.gradle b/module/spring-boot-security-oauth2-client/build.gradle index ba2625c2ddf..6d4b3660c7b 100644 --- a/module/spring-boot-security-oauth2-client/build.gradle +++ b/module/spring-boot-security-oauth2-client/build.gradle @@ -44,6 +44,12 @@ dependencies { testImplementation("com.squareup.okhttp3:mockwebserver") testImplementation("tools.jackson.core:jackson-databind") + testCompileOnly("com.google.code.findbugs:jsr305") + testRuntimeOnly("ch.qos.logback:logback-classic") testRuntimeOnly("org.springframework:spring-webflux") } + +tasks.named("compileTestJava") { + options.nullability.checking = "tests" +} diff --git a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientPropertiesMapperTests.java b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientPropertiesMapperTests.java index af1eb9e163f..93cf666cd13 100644 --- a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientPropertiesMapperTests.java +++ b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientPropertiesMapperTests.java @@ -22,6 +22,7 @@ import java.util.Map; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import tools.jackson.databind.ObjectMapper; @@ -51,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; */ class OAuth2ClientPropertiesMapperTests { - private MockWebServer server; + private @Nullable MockWebServer server; @AfterEach void cleanup() throws Exception { @@ -72,6 +73,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("registration"); + assertThat(adapted).isNotNull(); ProviderDetails adaptedProvider = adapted.getProviderDetails(); assertThat(adaptedProvider.getAuthorizationUri()).isEqualTo("https://example.com/auth"); assertThat(adaptedProvider.getTokenUri()).isEqualTo("https://example.com/token"); @@ -104,6 +106,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("registration"); + assertThat(adapted).isNotNull(); ProviderDetails adaptedProvider = adapted.getProviderDetails(); assertThat(adaptedProvider.getAuthorizationUri()).isEqualTo("https://accounts.google.com/o/oauth2/v2/auth"); assertThat(adaptedProvider.getTokenUri()).isEqualTo("https://www.googleapis.com/oauth2/v4/token"); @@ -132,6 +135,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("registration"); + assertThat(adapted).isNotNull(); ProviderDetails adaptedProvider = adapted.getProviderDetails(); assertThat(adaptedProvider.getAuthorizationUri()).isEqualTo("https://accounts.google.com/o/oauth2/v2/auth"); assertThat(adaptedProvider.getTokenUri()).isEqualTo("https://www.googleapis.com/oauth2/v4/token"); @@ -174,6 +178,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("google"); + assertThat(adapted).isNotNull(); ProviderDetails adaptedProvider = adapted.getProviderDetails(); assertThat(adaptedProvider.getAuthorizationUri()).isEqualTo("https://accounts.google.com/o/oauth2/v2/auth"); assertThat(adaptedProvider.getTokenUri()).isEqualTo("https://www.googleapis.com/oauth2/v4/token"); @@ -252,6 +257,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("okta"); + assertThat(adapted).isNotNull(); ProviderDetails providerDetails = adapted.getProviderDetails(); assertThat(adapted.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.CLIENT_SECRET_POST); assertThat(adapted.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE); @@ -303,6 +309,7 @@ class OAuth2ClientPropertiesMapperTests { Map registrations = new OAuth2ClientPropertiesMapper(properties) .asClientRegistrations(); ClientRegistration adapted = registrations.get("okta"); + assertThat(adapted).isNotNull(); ProviderDetails providerDetails = adapted.getProviderDetails(); assertThat(adapted.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); assertThat(adapted.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE); @@ -323,10 +330,12 @@ class OAuth2ClientPropertiesMapperTests { MockResponse mockResponse = new MockResponse().setResponseCode(HttpStatus.OK.value()) .setBody(new ObjectMapper().writeValueAsString(getResponse(issuer))) .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + assertThat(this.server).isNotNull(); this.server.enqueue(mockResponse); } private void setupMockResponsesWithErrors(String issuer, int errorResponseCount) { + assertThat(this.server).isNotNull(); for (int i = 0; i < errorResponseCount; i++) { MockResponse emptyResponse = new MockResponse().setResponseCode(HttpStatus.NOT_FOUND.value()); this.server.enqueue(emptyResponse); diff --git a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/reactive/ReactiveOAuth2ClientWebSecurityAutoConfigurationTests.java b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/reactive/ReactiveOAuth2ClientWebSecurityAutoConfigurationTests.java index 9ce21f9fb9d..397af9d7d45 100644 --- a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/reactive/ReactiveOAuth2ClientWebSecurityAutoConfigurationTests.java +++ b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/reactive/ReactiveOAuth2ClientWebSecurityAutoConfigurationTests.java @@ -117,6 +117,7 @@ class ReactiveOAuth2ClientWebSecurityAutoConfigurationTests { SecurityWebFilterChain filterChain = (SecurityWebFilterChain) context .getBean(BeanIds.SPRING_SECURITY_FILTER_CHAIN); List filters = (List) ReflectionTestUtils.getField(filterChain, "filters"); + assertThat(filters).isNotNull(); return filters.stream().anyMatch(filter::isInstance); } diff --git a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/servlet/OAuth2ClientWebSecurityAutoConfigurationTests.java b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/servlet/OAuth2ClientWebSecurityAutoConfigurationTests.java index 43a860d0676..05238e28893 100644 --- a/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/servlet/OAuth2ClientWebSecurityAutoConfigurationTests.java +++ b/module/spring-boot-security-oauth2-client/src/test/java/org/springframework/boot/security/oauth2/client/autoconfigure/servlet/OAuth2ClientWebSecurityAutoConfigurationTests.java @@ -90,6 +90,7 @@ class OAuth2ClientWebSecurityAutoConfigurationTests { ClientRegistrationRepository actual = (ClientRegistrationRepository) ReflectionTestUtils.getField( getSecurityFilters(context, OAuth2LoginAuthenticationFilter.class).get(0), "clientRegistrationRepository"); + assertThat(actual).isNotNull(); assertThat(isEqual(expected.findByRegistrationId("first"), actual.findByRegistrationId("first"))).isTrue(); assertThat(isEqual(expected.findByRegistrationId("second"), actual.findByRegistrationId("second"))) .isTrue(); @@ -103,6 +104,7 @@ class OAuth2ClientWebSecurityAutoConfigurationTests { ClientRegistrationRepository actual = (ClientRegistrationRepository) ReflectionTestUtils.getField( getSecurityFilters(context, OAuth2AuthorizationCodeGrantFilter.class).get(0), "clientRegistrationRepository"); + assertThat(actual).isNotNull(); assertThat(isEqual(expected.findByRegistrationId("first"), actual.findByRegistrationId("first"))).isTrue(); assertThat(isEqual(expected.findByRegistrationId("second"), actual.findByRegistrationId("second"))) .isTrue(); @@ -145,8 +147,7 @@ class OAuth2ClientWebSecurityAutoConfigurationTests { private SecurityFilterChain getSecurityFilterChain(AssertableWebApplicationContext context) { Filter springSecurityFilterChain = context.getBean(BeanIds.SPRING_SECURITY_FILTER_CHAIN, Filter.class); FilterChainProxy filterChainProxy = getFilterChainProxy(springSecurityFilterChain); - SecurityFilterChain securityFilterChain = filterChainProxy.getFilterChains().get(0); - return securityFilterChain; + return filterChainProxy.getFilterChains().get(0); } private FilterChainProxy getFilterChainProxy(Filter filter) { @@ -155,6 +156,7 @@ class OAuth2ClientWebSecurityAutoConfigurationTests { } if (filter instanceof CompositeFilter) { List filters = (List) ReflectionTestUtils.getField(filter, "filters"); + assertThat(filters).isNotNull(); return (FilterChainProxy) filters.stream() .filter(FilterChainProxy.class::isInstance) .findFirst()