diff --git a/module/spring-boot-graphql/build.gradle b/module/spring-boot-graphql/build.gradle index 021d2865a6d..2034744222b 100644 --- a/module/spring-boot-graphql/build.gradle +++ b/module/spring-boot-graphql/build.gradle @@ -54,5 +54,11 @@ dependencies { testImplementation("org.springframework.graphql:spring-graphql-test") testImplementation("org.springframework.security:spring-security-test") + testCompileOnly("com.google.code.findbugs:jsr305") + testRuntimeOnly("ch.qos.logback:logback-classic") } + +tasks.named("compileTestJava") { + options.nullability.checking = "tests" +} diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/Book.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/Book.java index 3648005fe8b..51a7b70893c 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/Book.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/Book.java @@ -26,15 +26,19 @@ import org.springframework.data.annotation.Id; public class Book { @Id + @SuppressWarnings("NullAway.Init") String id; + @SuppressWarnings("NullAway.Init") String name; + @SuppressWarnings("NullAway.Init") int pageCount; + @SuppressWarnings("NullAway.Init") String author; - public Book() { + protected Book() { } public Book(String id, String name, int pageCount, String author) { diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/DefaultGraphQlSchemaConditionTests.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/DefaultGraphQlSchemaConditionTests.java index 3dd6ebb780e..259ea8e0098 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/DefaultGraphQlSchemaConditionTests.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/DefaultGraphQlSchemaConditionTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.graphql.autoconfigure; import java.util.Collection; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; @@ -78,7 +79,7 @@ class DefaultGraphQlSchemaConditionTests { assertThat(context.getBean("success")).isEqualTo("success"); } - private String conditionReportMessage(AssertableApplicationContext context) { + private @Nullable String conditionReportMessage(AssertableApplicationContext context) { Collection conditionAndOutcomes = ConditionEvaluationReport .get(context.getSourceApplicationContext().getBeanFactory()) .getConditionAndOutcomesBySource() diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/GraphQlTestDataFetchers.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/GraphQlTestDataFetchers.java index 9dd190d00c2..6062af81721 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/GraphQlTestDataFetchers.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/GraphQlTestDataFetchers.java @@ -20,8 +20,11 @@ import java.util.Arrays; import java.util.List; import graphql.schema.DataFetcher; +import org.jspecify.annotations.Nullable; import reactor.core.publisher.Flux; +import static org.assertj.core.api.Assertions.assertThat; + /** * Test utility class holding {@link DataFetcher} implementations. * @@ -39,14 +42,22 @@ public final class GraphQlTestDataFetchers { } public static DataFetcher getBookByIdDataFetcher() { - return (environment) -> getBookById(environment.getArgument("id")); + return (environment) -> { + String id = environment.getArgument("id"); + assertThat(id).isNotNull(); + return getBookById(id); + }; } public static DataFetcher> getBooksOnSaleDataFetcher() { - return (environment) -> getBooksOnSale(environment.getArgument("minPages")); + return (environment) -> { + Integer minPages = environment.getArgument("minPages"); + assertThat(minPages).isNotNull(); + return getBooksOnSale(minPages); + }; } - public static Book getBookById(String id) { + public static @Nullable Book getBookById(String id) { return books.stream().filter((book) -> book.getId().equals(id)).findFirst().orElse(null); } diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/reactive/GraphQlWebFluxAutoConfigurationTests.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/reactive/GraphQlWebFluxAutoConfigurationTests.java index 489107b7897..f29a9eb2ca0 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/reactive/GraphQlWebFluxAutoConfigurationTests.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/reactive/GraphQlWebFluxAutoConfigurationTests.java @@ -23,6 +23,7 @@ import java.util.function.Consumer; import graphql.schema.idl.TypeRuntimeWiring; import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; @@ -354,13 +355,13 @@ class GraphQlWebFluxAutoConfigurationTests { @Bean @Order(-1) RouterFunction before() { - return (r) -> null; + return (r) -> Mono.empty(); } @Bean @Order(1) RouterFunction after() { - return (r) -> null; + return (r) -> Mono.empty(); } } diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebFluxSecurityAutoConfigurationTests.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebFluxSecurityAutoConfigurationTests.java index c0c5948ede3..431d35f2659 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebFluxSecurityAutoConfigurationTests.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebFluxSecurityAutoConfigurationTests.java @@ -153,8 +153,11 @@ class GraphQlWebFluxSecurityAutoConfigurationTests { @Bean RuntimeWiringConfigurer bookDataFetcher(BookService bookService) { - return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("bookById", (env) -> bookService.getBookdById(env.getArgument("id")))); + return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query").dataFetcher("bookById", (env) -> { + String id = env.getArgument("id"); + assertThat(id).isNotNull(); + return bookService.getBookdById(id); + })); } @Bean diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebMvcSecurityAutoConfigurationTests.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebMvcSecurityAutoConfigurationTests.java index 13126e4deaf..1ea419e85ef 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebMvcSecurityAutoConfigurationTests.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/security/GraphQlWebMvcSecurityAutoConfigurationTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.graphql.autoconfigure.security; import graphql.schema.idl.TypeRuntimeWiring; import org.assertj.core.api.ThrowingConsumer; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -142,8 +143,11 @@ class GraphQlWebMvcSecurityAutoConfigurationTests { @Bean RuntimeWiringConfigurer bookDataFetcher(BookService bookService) { - return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("bookById", (env) -> bookService.getBookdById(env.getArgument("id")))); + return (builder) -> builder.type(TypeRuntimeWiring.newTypeWiring("Query").dataFetcher("bookById", (env) -> { + String id = env.getArgument("id"); + assertThat(id).isNotNull(); + return bookService.getBookdById(id); + })); } @Bean @@ -156,7 +160,7 @@ class GraphQlWebMvcSecurityAutoConfigurationTests { static class BookService { @PreAuthorize("hasRole('USER')") - Book getBookdById(String id) { + @Nullable Book getBookdById(String id) { return GraphQlTestDataFetchers.getBookById(id); } diff --git a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/servlet/GraphQlWebMvcAutoConfigurationTests.java b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/servlet/GraphQlWebMvcAutoConfigurationTests.java index 609d7f5c2c3..940ddf07ea4 100644 --- a/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/servlet/GraphQlWebMvcAutoConfigurationTests.java +++ b/module/spring-boot-graphql/src/test/java/org/springframework/boot/graphql/autoconfigure/servlet/GraphQlWebMvcAutoConfigurationTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.graphql.autoconfigure.servlet; import java.time.Duration; import java.util.Map; +import java.util.Optional; import graphql.schema.idl.TypeRuntimeWiring; import org.assertj.core.api.ThrowingConsumer; @@ -313,13 +314,13 @@ class GraphQlWebMvcAutoConfigurationTests { @Bean @Order(-1) RouterFunction before() { - return (r) -> null; + return (r) -> Optional.empty(); } @Bean @Order(1) RouterFunction after() { - return (r) -> null; + return (r) -> Optional.empty(); } }