diff --git a/module/spring-boot-data-mongodb/build.gradle b/module/spring-boot-data-mongodb/build.gradle index 1eee13e63de..e77cada1ad3 100644 --- a/module/spring-boot-data-mongodb/build.gradle +++ b/module/spring-boot-data-mongodb/build.gradle @@ -39,6 +39,7 @@ dependencies { optional("org.mongodb:mongodb-driver-sync") testCompileOnly("com.fasterxml.jackson.core:jackson-annotations") + testCompileOnly("com.google.code.findbugs:jsr305") testImplementation(project(":core:spring-boot-test")) testImplementation(project(":test-support:spring-boot-test-support")) @@ -47,3 +48,7 @@ dependencies { testRuntimeOnly("ch.qos.logback:logback-classic") } + +tasks.named("compileTestJava") { + options.nullability.checking = "tests" +} diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoAutoConfigurationTests.java index d13fc44bf8c..88278b8fc26 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoAutoConfigurationTests.java @@ -26,6 +26,7 @@ import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.gridfs.GridFSBucket; import org.assertj.core.api.InstanceOfAssertFactories; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; @@ -84,13 +85,11 @@ class DataMongoAutoConfigurationTests { } @Test - @SuppressWarnings("unchecked") void whenGridFsDatabaseIsConfiguredThenGridFsTemplateIsAutoConfiguredAndUsesIt() { this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.database:grid").run((context) -> { assertThat(context).hasSingleBean(GridFsTemplate.class); GridFsTemplate template = context.getBean(GridFsTemplate.class); - GridFSBucket bucket = ((Supplier) ReflectionTestUtils.getField(template, "bucketSupplier")) - .get(); + GridFSBucket bucket = getBucket(template); assertThat(bucket).extracting("filesCollection", InstanceOfAssertFactories.type(MongoCollection.class)) .extracting((collection) -> collection.getNamespace().getDatabaseName()) .isEqualTo("grid"); @@ -98,13 +97,11 @@ class DataMongoAutoConfigurationTests { } @Test - @SuppressWarnings("unchecked") void whenGridFsBucketIsConfiguredThenGridFsTemplateIsAutoConfiguredAndUsesIt() { this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.bucket:test-bucket").run((context) -> { assertThat(context).hasSingleBean(GridFsTemplate.class); GridFsTemplate template = context.getBean(GridFsTemplate.class); - GridFSBucket bucket = ((Supplier) ReflectionTestUtils.getField(template, "bucketSupplier")) - .get(); + GridFSBucket bucket = getBucket(template); assertThat(bucket.getBucketName()).isEqualTo("test-bucket"); }); } @@ -169,8 +166,7 @@ class DataMongoAutoConfigurationTests { void defaultFieldNamingStrategy() { this.contextRunner.run((context) -> { MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); - FieldNamingStrategy fieldNamingStrategy = (FieldNamingStrategy) ReflectionTestUtils.getField(mappingContext, - "fieldNamingStrategy"); + FieldNamingStrategy fieldNamingStrategy = getFieldNamingStrategy(mappingContext); assertThat(fieldNamingStrategy.getClass()).isEqualTo(PropertyNameFieldNamingStrategy.class); }); } @@ -182,8 +178,7 @@ class DataMongoAutoConfigurationTests { + CamelCaseAbbreviatingFieldNamingStrategy.class.getName()) .run((context) -> { MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); - FieldNamingStrategy fieldNamingStrategy = (FieldNamingStrategy) ReflectionTestUtils - .getField(mappingContext, "fieldNamingStrategy"); + FieldNamingStrategy fieldNamingStrategy = getFieldNamingStrategy(mappingContext); assertThat(fieldNamingStrategy.getClass()).isEqualTo(CamelCaseAbbreviatingFieldNamingStrategy.class); }); } @@ -216,6 +211,7 @@ class DataMongoAutoConfigurationTests { this.contextRunner.withUserConfiguration(EntityScanConfig.class).run((context) -> { MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); ManagedTypes managedTypes = (ManagedTypes) ReflectionTestUtils.getField(mappingContext, "managedTypes"); + assertThat(managedTypes).isNotNull(); assertThat(managedTypes.toList()).containsOnly(City.class, Country.class); }); @@ -226,7 +222,9 @@ class DataMongoAutoConfigurationTests { this.contextRunner.run((context) -> { MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); MongoPersistentEntity entity = mappingContext.getPersistentEntity(Sample.class); + assertThat(entity).isNotNull(); MongoPersistentProperty dateProperty = entity.getPersistentProperty("date"); + assertThat(dateProperty).isNotNull(); assertThat(dateProperty.isEntity()).isFalse(); }); @@ -346,9 +344,24 @@ class DataMongoAutoConfigurationTests { private static void assertDomainTypesDiscovered(MongoMappingContext mappingContext, Class... types) { ManagedTypes managedTypes = (ManagedTypes) ReflectionTestUtils.getField(mappingContext, "managedTypes"); + assertThat(managedTypes).isNotNull(); assertThat(managedTypes.toList()).containsOnly(types); } + @SuppressWarnings("unchecked") + private GridFSBucket getBucket(GridFsTemplate template) { + Supplier field = (Supplier) ReflectionTestUtils.getField(template, + "bucketSupplier"); + assertThat(field).isNotNull(); + return field.get(); + } + + private FieldNamingStrategy getFieldNamingStrategy(MongoMappingContext mappingContext) { + Object field = ReflectionTestUtils.getField(mappingContext, "fieldNamingStrategy"); + assertThat(field).isNotNull(); + return (FieldNamingStrategy) field; + } + @Configuration(proxyBeanMethods = false) static class CustomConversionsConfig { @@ -388,7 +401,7 @@ class DataMongoAutoConfigurationTests { static class MyConverter implements Converter { @Override - public Boolean convert(MongoClient source) { + public @Nullable Boolean convert(MongoClient source) { return null; } @@ -396,7 +409,7 @@ class DataMongoAutoConfigurationTests { static class Sample { - LocalDateTime date; + @Nullable LocalDateTime date; } diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java index 43e05d58feb..d7a7be9720c 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java @@ -51,8 +51,9 @@ class DataMongoPropertiesTests { } private BigDecimalRepresentation springDataDefaultBigDecimalRepresentation() { - return (BigDecimalRepresentation) ReflectionTestUtils.getField(new MongoConverterConfigurationAdapter(), - "bigDecimals"); + Object field = ReflectionTestUtils.getField(new MongoConverterConfigurationAdapter(), "bigDecimals"); + assertThat(field).isNotNull(); + return (BigDecimalRepresentation) field; } } diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAndBlockingRepositoriesAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAndBlockingRepositoriesAutoConfigurationTests.java index ec431e75083..b7464f5e171 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAndBlockingRepositoriesAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAndBlockingRepositoriesAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.data.mongodb.autoconfigure; import java.util.ArrayList; import java.util.List; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -46,11 +47,13 @@ import static org.assertj.core.api.Assertions.assertThat; */ class DataMongoReactiveAndBlockingRepositoriesAutoConfigurationTests { - private AnnotationConfigApplicationContext context; + private @Nullable AnnotationConfigApplicationContext context; @AfterEach void close() { - this.context.close(); + if (this.context != null) { + this.context.close(); + } } @Test diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfigurationTests.java index 4480764136c..35b838e8abd 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.data.mongodb.autoconfigure; import java.time.Duration; import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.reactivestreams.client.gridfs.GridFSBucket; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; @@ -76,8 +77,10 @@ class DataMongoReactiveAutoConfigurationTests { this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.bucket:test-bucket").run((context) -> { assertThat(context).hasSingleBean(ReactiveGridFsTemplate.class); ReactiveGridFsTemplate template = context.getBean(ReactiveGridFsTemplate.class); - GridFSBucket bucket = ((Mono) ReflectionTestUtils.getField(template, "bucketSupplier")) - .block(Duration.ofSeconds(30)); + Mono field = (Mono) ReflectionTestUtils.getField(template, "bucketSupplier"); + assertThat(field).isNotNull(); + GridFSBucket bucket = field.block(Duration.ofSeconds(30)); + assertThat(bucket).isNotNull(); assertThat(bucket.getBucketName()).isEqualTo("test-bucket"); }); } @@ -94,7 +97,9 @@ class DataMongoReactiveAutoConfigurationTests { this.contextRunner.run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("test"); + MongoDatabase mongoDatabase = factory.getMongoDatabase().block(); + assertThat(mongoDatabase).isNotNull(); + assertThat(mongoDatabase.getName()).isEqualTo("test"); }); } @@ -103,7 +108,9 @@ class DataMongoReactiveAutoConfigurationTests { this.contextRunner.withPropertyValues("spring.mongodb.database=mydb").run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); + MongoDatabase mongoDatabase = factory.getMongoDatabase().block(); + assertThat(mongoDatabase).isNotNull(); + assertThat(mongoDatabase.getName()).isEqualTo("mydb"); }); } @@ -112,7 +119,9 @@ class DataMongoReactiveAutoConfigurationTests { this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/mydb").run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); + MongoDatabase mongoDatabase = factory.getMongoDatabase().block(); + assertThat(mongoDatabase).isNotNull(); + assertThat(mongoDatabase.getName()).isEqualTo("mydb"); }); } @@ -124,7 +133,9 @@ class DataMongoReactiveAutoConfigurationTests { .run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); + MongoDatabase mongoDatabase = factory.getMongoDatabase().block(); + assertThat(mongoDatabase).isNotNull(); + assertThat(mongoDatabase.getName()).isEqualTo("mydb"); }); } @@ -135,7 +146,9 @@ class DataMongoReactiveAutoConfigurationTests { .run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); + MongoDatabase mongoDatabase = factory.getMongoDatabase().block(); + assertThat(mongoDatabase).isNotNull(); + assertThat(mongoDatabase.getName()).isEqualTo("mydb"); }); } @@ -157,9 +170,12 @@ class DataMongoReactiveAutoConfigurationTests { private String grisFsTemplateDatabaseName(AssertableApplicationContext context) { assertThat(context).hasSingleBean(ReactiveGridFsTemplate.class); ReactiveGridFsTemplate template = context.getBean(ReactiveGridFsTemplate.class); - GridFSBucket bucket = ((Mono) ReflectionTestUtils.getField(template, "bucketSupplier")) - .block(Duration.ofSeconds(30)); + Mono field = (Mono) ReflectionTestUtils.getField(template, "bucketSupplier"); + assertThat(field).isNotNull(); + GridFSBucket bucket = field.block(Duration.ofSeconds(30)); + assertThat(bucket).isNotNull(); MongoCollection collection = (MongoCollection) ReflectionTestUtils.getField(bucket, "filesCollection"); + assertThat(collection).isNotNull(); return collection.getNamespace().getDatabaseName(); } diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveRepositoriesAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveRepositoriesAutoConfigurationTests.java index 9b44b91c5f3..fe7c311eb94 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveRepositoriesAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveRepositoriesAutoConfigurationTests.java @@ -59,6 +59,7 @@ class DataMongoReactiveRepositoriesAutoConfigurationTests { assertThat(context).hasSingleBean(MongoClient.class); MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); ManagedTypes managedTypes = (ManagedTypes) ReflectionTestUtils.getField(mappingContext, "managedTypes"); + assertThat(managedTypes).isNotNull(); assertThat(managedTypes.toList()).hasSize(1); }); } diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoRepositoriesAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoRepositoriesAutoConfigurationTests.java index d1d9e2fd7ee..150bd224d64 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoRepositoriesAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoRepositoriesAutoConfigurationTests.java @@ -55,6 +55,7 @@ class DataMongoRepositoriesAutoConfigurationTests { assertThat(context).hasSingleBean(MongoClient.class); MongoMappingContext mappingContext = context.getBean(MongoMappingContext.class); ManagedTypes managedTypes = (ManagedTypes) ReflectionTestUtils.getField(mappingContext, "managedTypes"); + assertThat(managedTypes).isNotNull(); assertThat(managedTypes.toList()).hasSize(1); }); }