Add nullability annotations to tests in module/spring-boot-graphql

See gh-47263
This commit is contained in:
Moritz Halbritter 2025-09-19 15:01:00 +02:00
parent e83ad75d3e
commit 4854fec275
8 changed files with 45 additions and 14 deletions

View File

@ -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"
}

View File

@ -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) {

View File

@ -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<ConditionEvaluationReport.ConditionAndOutcomes> conditionAndOutcomes = ConditionEvaluationReport
.get(context.getSourceApplicationContext().getBeanFactory())
.getConditionAndOutcomesBySource()

View File

@ -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<Book> getBookByIdDataFetcher() {
return (environment) -> getBookById(environment.getArgument("id"));
return (environment) -> {
String id = environment.getArgument("id");
assertThat(id).isNotNull();
return getBookById(id);
};
}
public static DataFetcher<Flux<Book>> 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);
}

View File

@ -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();
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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();
}
}