PropertyDescriptorResolverTests Class — spring-boot Architecture
Architecture documentation for the PropertyDescriptorResolverTests class in PropertyDescriptorResolverTests.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
configuration-metadata/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/PropertyDescriptorResolverTests.java lines 64–224
class PropertyDescriptorResolverTests {
@Test
void propertiesWithJavaBeanProperties() {
process(SimpleProperties.class,
propertyNames((stream) -> assertThat(stream).containsExactly("theName", "flag", "comparator")));
}
@Test
void propertiesWithJavaBeanHierarchicalProperties() {
process(HierarchicalProperties.class,
Arrays.asList(HierarchicalPropertiesParent.class, HierarchicalPropertiesGrandparent.class),
(type, metadataEnv) -> {
PropertyDescriptorResolver resolver = new PropertyDescriptorResolver(metadataEnv);
assertThat(resolver.resolve(type, null).map(PropertyDescriptor::getName)).containsExactly("third",
"second", "first");
assertThat(resolver.resolve(type, null)
.map((descriptor) -> descriptor.getGetter().getEnclosingElement().getSimpleName().toString()))
.containsExactly("HierarchicalProperties", "HierarchicalPropertiesParent",
"HierarchicalPropertiesParent");
List<ItemMetadata> itemMetadataList = resolver.resolve(type, null)
.map((descriptor) -> descriptor.resolveItemMetadata("test", metadataEnv))
.toList();
assertThat(itemMetadataList).map(ItemMetadata::getDefaultValue)
.containsExactly("three", "two", "one");
assertThat(itemMetadataList).map(ItemMetadata::getDescription)
.containsExactly("Concrete property.", "Parent property.", "Grandparent property.");
});
}
@Test
void propertiesWithLombokGetterSetterAtClassLevel() {
process(LombokSimpleProperties.class, propertyNames(
(stream) -> assertThat(stream).containsExactly("name", "description", "counter", "number", "items")));
}
@Test
void propertiesWithLombokGetterSetterAtFieldLevel() {
process(LombokExplicitProperties.class, propertyNames(
(stream) -> assertThat(stream).containsExactly("name", "description", "counter", "number", "items")));
}
@Test
void propertiesWithLombokDataClass() {
process(LombokSimpleDataProperties.class, propertyNames(
(stream) -> assertThat(stream).containsExactly("name", "description", "counter", "number", "items")));
}
@Test
void propertiesWithLombokValueClass() {
process(LombokSimpleValueProperties.class, propertyNames(
(stream) -> assertThat(stream).containsExactly("name", "description", "counter", "number", "items")));
}
@Test
void propertiesWithDeducedConstructorBinding() {
process(ImmutableDeducedConstructorBindingProperties.class,
propertyNames((stream) -> assertThat(stream).containsExactly("theName", "flag")));
process(ImmutableDeducedConstructorBindingProperties.class,
properties((stream) -> assertThat(stream).isNotEmpty()
.allMatch((predicate) -> predicate instanceof ConstructorParameterPropertyDescriptor)));
}
@Test
void propertiesWithConstructorWithConstructorBinding() {
process(ImmutableSimpleProperties.class, propertyNames(
(stream) -> assertThat(stream).containsExactly("theName", "flag", "comparator", "counter")));
process(ImmutableSimpleProperties.class, properties((stream) -> assertThat(stream).isNotEmpty()
.allMatch((predicate) -> predicate instanceof ConstructorParameterPropertyDescriptor)));
}
@Test
void propertiesWithConstructorAndClassConstructorBinding() {
process(ImmutableClassConstructorBindingProperties.class,
propertyNames((stream) -> assertThat(stream).containsExactly("name", "description")));
process(ImmutableClassConstructorBindingProperties.class, properties((stream) -> assertThat(stream).isNotEmpty()
.allMatch((predicate) -> predicate instanceof ConstructorParameterPropertyDescriptor)));
}
@Test
void propertiesWithAutowiredConstructor() {
process(AutowiredProperties.class, propertyNames((stream) -> assertThat(stream).containsExactly("theName")));
process(AutowiredProperties.class, properties((stream) -> assertThat(stream).isNotEmpty()
.allMatch((predicate) -> predicate instanceof JavaBeanPropertyDescriptor)));
}
@Test
void propertiesWithMultiConstructor() {
process(ImmutableMultiConstructorProperties.class,
propertyNames((stream) -> assertThat(stream).containsExactly("name", "description")));
process(ImmutableMultiConstructorProperties.class, properties((stream) -> assertThat(stream).isNotEmpty()
.allMatch((predicate) -> predicate instanceof ConstructorParameterPropertyDescriptor)));
}
@Test
void propertiesWithMultiConstructorNoDirective() {
process(TwoConstructorsExample.class, propertyNames((stream) -> assertThat(stream).containsExactly("name")));
process(TwoConstructorsExample.class,
properties((stream) -> assertThat(stream).element(0).isInstanceOf(JavaBeanPropertyDescriptor.class)));
}
@Test
void constructorParameterPropertyWithNameAnnotationParameter() {
process(ConstructorParameterNameAnnotationProperties.class,
propertyNames((stream) -> assertThat(stream).containsOnly("import", "default")));
}
@Test
void recordComponentPropertyWithNameAnnotationParameter() {
process(RecordComponentNameAnnotationProperties.class,
propertyNames((stream) -> assertThat(stream).containsOnly("import", "default")));
}
@Test
void javaBeanPropertyWithNameAnnotationParameter() {
process(JavaBeanNameAnnotationProperties.class,
propertyNames((stream) -> assertThat(stream).containsOnly("import", "default")));
}
@Test
void lombokPropertyWithNameAnnotationParameter() {
process(LombokNameAnnotationProperties.class,
propertyNames((stream) -> assertThat(stream).containsOnly("import", "default")));
}
private BiConsumer<TypeElement, MetadataGenerationEnvironment> properties(
Consumer<Stream<PropertyDescriptor>> stream) {
return (element, metadataEnv) -> {
PropertyDescriptorResolver resolver = new PropertyDescriptorResolver(metadataEnv);
stream.accept(resolver.resolve(element, null));
};
}
private BiConsumer<TypeElement, MetadataGenerationEnvironment> propertyNames(Consumer<Stream<String>> stream) {
return properties((result) -> stream.accept(result.map(PropertyDescriptor::getName)));
}
private void process(Class<?> target, BiConsumer<TypeElement, MetadataGenerationEnvironment> consumer) {
process(target, Collections.emptyList(), consumer);
}
private void process(Class<?> target, Collection<Class<?>> additionalClasses,
BiConsumer<TypeElement, MetadataGenerationEnvironment> consumer) {
BiConsumer<RoundEnvironmentTester, MetadataGenerationEnvironment> internalConsumer = (roundEnv,
metadataEnv) -> {
TypeElement element = roundEnv.getRootElement(target);
consumer.accept(element, metadataEnv);
};
TestableAnnotationProcessor<MetadataGenerationEnvironment> processor = new TestableAnnotationProcessor<>(
internalConsumer, new MetadataGenerationEnvironmentFactory());
SourceFile targetSource = SourceFile.forTestClass(target);
List<SourceFile> additionalSource = additionalClasses.stream().map(SourceFile::forTestClass).toList();
TestCompiler compiler = TestCompiler.forSystem()
.withProcessors(processor)
.withSources(targetSource)
.withSources(additionalSource);
compiler.compile((compiled) -> {
});
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free