Add nullability annotations to tests in module/spring-boot-data-mongodb

See gh-47263
This commit is contained in:
Moritz Halbritter 2025-09-19 12:40:42 +02:00
parent 5c0d2ee180
commit 09967b1a5d
7 changed files with 65 additions and 25 deletions

View File

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

View File

@ -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<GridFSBucket>) 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<GridFSBucket>) 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<GridFSBucket> field = (Supplier<GridFSBucket>) 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<MongoClient, Boolean> {
@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;
}

View File

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

View File

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

View File

@ -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<GridFSBucket>) ReflectionTestUtils.getField(template, "bucketSupplier"))
.block(Duration.ofSeconds(30));
Mono<GridFSBucket> field = (Mono<GridFSBucket>) 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<GridFSBucket>) ReflectionTestUtils.getField(template, "bucketSupplier"))
.block(Duration.ofSeconds(30));
Mono<GridFSBucket> field = (Mono<GridFSBucket>) 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();
}

View File

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

View File

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