Polish "Improve testing of architecture checks"

See gh-48139
This commit is contained in:
Stéphane Nicoll
2025-12-01 11:27:16 +01:00
parent 8e65122576
commit d9bf31349a
3 changed files with 50 additions and 36 deletions
@@ -59,8 +59,6 @@ import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.VerificationException;
import org.springframework.boot.build.architecture.ArchitectureCheckAnnotations.Annotation;
/**
* {@link Task} that checks for architecture problems.
*
@@ -77,22 +75,22 @@ public abstract class ArchitectureCheck extends DefaultTask {
public ArchitectureCheck() {
getOutputDirectory().convention(getProject().getLayout().getBuildDirectory().dir(getName()));
getAnnotationClasses().convention(ArchitectureCheckAnnotations.asMap());
getAnnotationClasses().convention(ArchitectureCheckAnnotation.asMap());
getRules().addAll(getProhibitObjectsRequireNonNull().convention(true)
.map(whenTrue(ArchitectureRules::noClassesShouldCallObjectsRequireNonNull)));
getRules().addAll(ArchitectureRules.standard());
getRules().addAll(whenMainSources(() -> ArchitectureRules.beanMethods(
ArchitectureCheckAnnotations.classFor(getAnnotationClasses().get(), Annotation.CONDITIONAL_ON_CLASS))));
getRules().addAll(whenMainSources(() -> ArchitectureRules.conditionalOnMissingBean(ArchitectureCheckAnnotations
.classFor(getAnnotationClasses().get(), Annotation.CONDITIONAL_ON_MISSING_BEAN))));
getRules().addAll(whenMainSources(() -> ArchitectureRules.configurationProperties(ArchitectureCheckAnnotations
.classFor(getAnnotationClasses().get(), Annotation.CONFIGURATION_PROPERTIES))));
getRules()
.addAll(whenMainSources(() -> ArchitectureRules.configurationPropertiesBinding(ArchitectureCheckAnnotations
.classFor(getAnnotationClasses().get(), Annotation.CONFIGURATION_PROPERTIES_BINDING))));
getRules().addAll(
whenMainSources(() -> ArchitectureRules.configurationPropertiesDeprecation(ArchitectureCheckAnnotations
.classFor(getAnnotationClasses().get(), Annotation.DEPRECATED_CONFIGURATION_PROPERTY))));
getRules().addAll(whenMainSources(() -> ArchitectureRules.beanMethods(ArchitectureCheckAnnotation
.classFor(getAnnotationClasses().get(), ArchitectureCheckAnnotation.CONDITIONAL_ON_CLASS))));
getRules().addAll(whenMainSources(() -> ArchitectureRules.conditionalOnMissingBean(ArchitectureCheckAnnotation
.classFor(getAnnotationClasses().get(), ArchitectureCheckAnnotation.CONDITIONAL_ON_MISSING_BEAN))));
getRules().addAll(whenMainSources(() -> ArchitectureRules.configurationProperties(ArchitectureCheckAnnotation
.classFor(getAnnotationClasses().get(), ArchitectureCheckAnnotation.CONFIGURATION_PROPERTIES))));
getRules().addAll(whenMainSources(
() -> ArchitectureRules.configurationPropertiesBinding(ArchitectureCheckAnnotation.classFor(
getAnnotationClasses().get(), ArchitectureCheckAnnotation.CONFIGURATION_PROPERTIES_BINDING))));
getRules().addAll(whenMainSources(
() -> ArchitectureRules.configurationPropertiesDeprecation(ArchitectureCheckAnnotation.classFor(
getAnnotationClasses().get(), ArchitectureCheckAnnotation.DEPRECATED_CONFIGURATION_PROPERTY))));
getRuleDescriptions().set(getRules().map(this::asDescriptions));
}
@@ -23,35 +23,49 @@ import java.util.Map;
* tests.
*
* @author Scott Frederick
* @author Stephane Nicoll
*/
public final class ArchitectureCheckAnnotations {
public enum ArchitectureCheckAnnotation {
enum Annotation {
/**
* Condition on class check.
*/
CONDITIONAL_ON_CLASS,
CONDITIONAL_ON_CLASS, CONDITIONAL_ON_MISSING_BEAN, CONFIGURATION_PROPERTIES, DEPRECATED_CONFIGURATION_PROPERTY,
CONFIGURATION_PROPERTIES_BINDING
/**
* Condition on missing bean check.
*/
CONDITIONAL_ON_MISSING_BEAN,
}
/**
* Configuration properties bean.
*/
CONFIGURATION_PROPERTIES,
private ArchitectureCheckAnnotations() {
}
/**
* Deprecated configuration property.
*/
DEPRECATED_CONFIGURATION_PROPERTY,
private static final Map<String, String> annotationNameToClassName = Map.of(Annotation.CONDITIONAL_ON_CLASS.name(),
"org.springframework.boot.autoconfigure.condition.ConditionalOnClass",
Annotation.CONDITIONAL_ON_MISSING_BEAN.name(),
/**
* Custom implementation to bind configuration properties.
*/
CONFIGURATION_PROPERTIES_BINDING;
private static final Map<String, String> annotationNameToClassName = Map.of(CONDITIONAL_ON_CLASS.name(),
"org.springframework.boot.autoconfigure.condition.ConditionalOnClass", CONDITIONAL_ON_MISSING_BEAN.name(),
"org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean",
Annotation.CONFIGURATION_PROPERTIES.name(),
"org.springframework.boot.context.properties.ConfigurationProperties",
Annotation.DEPRECATED_CONFIGURATION_PROPERTY.name(),
CONFIGURATION_PROPERTIES.name(), "org.springframework.boot.context.properties.ConfigurationProperties",
DEPRECATED_CONFIGURATION_PROPERTY.name(),
"org.springframework.boot.context.properties.DeprecatedConfigurationProperty",
Annotation.CONFIGURATION_PROPERTIES_BINDING.name(),
CONFIGURATION_PROPERTIES_BINDING.name(),
"org.springframework.boot.context.properties.ConfigurationPropertiesBinding");
static Map<String, String> asMap() {
return annotationNameToClassName;
}
static String classFor(Map<String, String> annotationProperty, Annotation annotation) {
static String classFor(Map<String, String> annotationProperty, ArchitectureCheckAnnotation annotation) {
String name = annotation.name();
return annotationProperty.getOrDefault(name, asMap().get(name));
}
@@ -43,7 +43,6 @@ import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.springframework.boot.build.architecture.ArchitectureCheckAnnotations.Annotation;
import org.springframework.boot.build.architecture.annotations.TestConditionalOnClass;
import org.springframework.boot.build.architecture.annotations.TestConditionalOnMissingBean;
import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties;
@@ -530,28 +529,31 @@ class ArchitectureCheckTests {
}
GradleBuild withConditionalOnClassAnnotation() {
configureTasks(Annotation.CONDITIONAL_ON_CLASS.name(), TestConditionalOnClass.class.getName());
configureTasks(ArchitectureCheckAnnotation.CONDITIONAL_ON_CLASS.name(),
TestConditionalOnClass.class.getName());
return this;
}
GradleBuild withConditionalOnMissingBeanAnnotation() {
configureTasks(Annotation.CONDITIONAL_ON_MISSING_BEAN.name(), TestConditionalOnMissingBean.class.getName());
configureTasks(ArchitectureCheckAnnotation.CONDITIONAL_ON_MISSING_BEAN.name(),
TestConditionalOnMissingBean.class.getName());
return this;
}
GradleBuild withConfigurationPropertiesAnnotation() {
configureTasks(Annotation.CONFIGURATION_PROPERTIES.name(), TestConfigurationProperties.class.getName());
configureTasks(ArchitectureCheckAnnotation.CONFIGURATION_PROPERTIES.name(),
TestConfigurationProperties.class.getName());
return this;
}
GradleBuild withConfigurationPropertiesBindingAnnotation() {
configureTasks(Annotation.CONFIGURATION_PROPERTIES_BINDING.name(),
configureTasks(ArchitectureCheckAnnotation.CONFIGURATION_PROPERTIES_BINDING.name(),
TestConfigurationPropertiesBinding.class.getName());
return this;
}
GradleBuild withDeprecatedConfigurationPropertyAnnotation() {
configureTasks(Annotation.DEPRECATED_CONFIGURATION_PROPERTY.name(),
configureTasks(ArchitectureCheckAnnotation.DEPRECATED_CONFIGURATION_PROPERTY.name(),
TestDeprecatedConfigurationProperty.class.getName());
return this;
}