ConditionEvaluationReportTests Class — spring-boot Architecture
Architecture documentation for the ConditionEvaluationReportTests class in ConditionEvaluationReportTests.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportTests.java lines 58–366
@ExtendWith(MockitoExtension.class)
class ConditionEvaluationReportTests {
private DefaultListableBeanFactory beanFactory;
private ConditionEvaluationReport report;
@Mock
@SuppressWarnings("NullAway.Init")
private Condition condition1;
@Mock
@SuppressWarnings("NullAway.Init")
private Condition condition2;
@Mock
@SuppressWarnings("NullAway.Init")
private Condition condition3;
private @Nullable ConditionOutcome outcome1;
private @Nullable ConditionOutcome outcome2;
private @Nullable ConditionOutcome outcome3;
@BeforeEach
void setup() {
this.beanFactory = new DefaultListableBeanFactory();
this.report = ConditionEvaluationReport.get(this.beanFactory);
}
@Test
void get() {
assertThat(this.report).isNotNull();
assertThat(this.report).isSameAs(ConditionEvaluationReport.get(this.beanFactory));
}
@Test
void parent() {
this.beanFactory.setParentBeanFactory(new DefaultListableBeanFactory());
BeanFactory parentBeanFactory = this.beanFactory.getParentBeanFactory();
assertThat(parentBeanFactory).isNotNull();
ConditionEvaluationReport.get((ConfigurableListableBeanFactory) parentBeanFactory);
assertThat(this.report).isSameAs(ConditionEvaluationReport.get(this.beanFactory));
assertThat(this.report).isNotNull();
assertThat(this.report.getParent()).isNotNull();
ConditionEvaluationReport.get((ConfigurableListableBeanFactory) parentBeanFactory);
assertThat(this.report).isSameAs(ConditionEvaluationReport.get(this.beanFactory));
assertThat(this.report.getParent())
.isSameAs(ConditionEvaluationReport.get((ConfigurableListableBeanFactory) parentBeanFactory));
}
@Test
void parentBottomUp() {
this.beanFactory = new DefaultListableBeanFactory(); // NB: overrides setup
this.beanFactory.setParentBeanFactory(new DefaultListableBeanFactory());
BeanFactory parentBeanFactory = this.beanFactory.getParentBeanFactory();
assertThat(parentBeanFactory).isNotNull();
ConditionEvaluationReport.get((ConfigurableListableBeanFactory) parentBeanFactory);
this.report = ConditionEvaluationReport.get(this.beanFactory);
assertThat(this.report).isNotNull();
assertThat(this.report).isNotSameAs(this.report.getParent());
assertThat(this.report.getParent()).isNotNull();
assertThat(this.report.getParent().getParent()).isNull();
}
@Test
void recordConditionEvaluations() {
this.outcome1 = new ConditionOutcome(false, "m1");
this.outcome2 = new ConditionOutcome(false, "m2");
this.outcome3 = new ConditionOutcome(false, "m3");
this.report.recordConditionEvaluation("a", this.condition1, this.outcome1);
this.report.recordConditionEvaluation("a", this.condition2, this.outcome2);
this.report.recordConditionEvaluation("b", this.condition3, this.outcome3);
Map<String, ConditionAndOutcomes> map = this.report.getConditionAndOutcomesBySource();
assertThat(map).hasSize(2);
ConditionAndOutcomes a = map.get("a");
assertThat(a).isNotNull();
Iterator<ConditionAndOutcome> iterator = a.iterator();
ConditionAndOutcome conditionAndOutcome = iterator.next();
assertThat(conditionAndOutcome.getCondition()).isEqualTo(this.condition1);
assertThat(conditionAndOutcome.getOutcome()).isEqualTo(this.outcome1);
conditionAndOutcome = iterator.next();
assertThat(conditionAndOutcome.getCondition()).isEqualTo(this.condition2);
assertThat(conditionAndOutcome.getOutcome()).isEqualTo(this.outcome2);
assertThat(iterator.hasNext()).isFalse();
ConditionAndOutcomes b = map.get("b");
assertThat(b).isNotNull();
iterator = b.iterator();
conditionAndOutcome = iterator.next();
assertThat(conditionAndOutcome.getCondition()).isEqualTo(this.condition3);
assertThat(conditionAndOutcome.getOutcome()).isEqualTo(this.outcome3);
assertThat(iterator.hasNext()).isFalse();
}
@Test
void fullMatch() {
prepareMatches(true, true, true);
ConditionAndOutcomes a = this.report.getConditionAndOutcomesBySource().get("a");
assertThat(a).isNotNull();
assertThat(a.isFullMatch()).isTrue();
}
@Test
void notFullMatch() {
prepareMatches(true, false, true);
ConditionAndOutcomes a = this.report.getConditionAndOutcomesBySource().get("a");
assertThat(a).isNotNull();
assertThat(a.isFullMatch()).isFalse();
}
private void prepareMatches(boolean m1, boolean m2, boolean m3) {
this.outcome1 = new ConditionOutcome(m1, "m1");
this.outcome2 = new ConditionOutcome(m2, "m2");
this.outcome3 = new ConditionOutcome(m3, "m3");
this.report.recordConditionEvaluation("a", this.condition1, this.outcome1);
this.report.recordConditionEvaluation("a", this.condition2, this.outcome2);
this.report.recordConditionEvaluation("a", this.condition3, this.outcome3);
}
@Test
@SuppressWarnings("resource")
void springBootConditionPopulatesReport() {
ConditionEvaluationReport report = ConditionEvaluationReport
.get(new AnnotationConfigApplicationContext(Config.class).getBeanFactory());
assertThat(report.getUnconditionalClasses()).containsExactly(UnconditionalAutoConfiguration.class.getName());
assertThat(report.getConditionAndOutcomesBySource()).containsOnlyKeys(MatchingAutoConfiguration.class.getName(),
NonMatchingAutoConfiguration.class.getName());
assertThat(report.getConditionAndOutcomesBySource().get(MatchingAutoConfiguration.class.getName()))
.satisfies((outcomes) -> assertThat(outcomes).extracting(ConditionAndOutcome::getOutcome)
.extracting(ConditionOutcome::isMatch)
.containsOnly(true));
assertThat(report.getConditionAndOutcomesBySource().get(NonMatchingAutoConfiguration.class.getName()))
.satisfies((outcomes) -> assertThat(outcomes).extracting(ConditionAndOutcome::getOutcome)
.extracting(ConditionOutcome::isMatch)
.containsOnly(false));
}
@Test
void testDuplicateConditionAndOutcomes() {
ConditionAndOutcome outcome1 = new ConditionAndOutcome(this.condition1,
new ConditionOutcome(true, "Message 1"));
ConditionAndOutcome outcome2 = new ConditionAndOutcome(this.condition2,
new ConditionOutcome(true, "Message 2"));
ConditionAndOutcome outcome3 = new ConditionAndOutcome(this.condition3,
new ConditionOutcome(true, "Message 2"));
assertThat(outcome1).isNotEqualTo(outcome2);
assertThat(outcome2).isEqualTo(outcome3);
ConditionAndOutcomes outcomes = new ConditionAndOutcomes();
outcomes.add(this.condition1, new ConditionOutcome(true, "Message 1"));
outcomes.add(this.condition2, new ConditionOutcome(true, "Message 2"));
outcomes.add(this.condition3, new ConditionOutcome(true, "Message 2"));
assertThat(outcomes).hasSize(2);
}
@Test
void negativeOuterPositiveInnerBean() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("test.present=true").applyTo(context);
context.register(NegativeOuterConfig.class);
context.refresh();
ConditionEvaluationReport report = ConditionEvaluationReport.get(context.getBeanFactory());
Map<String, ConditionAndOutcomes> sourceOutcomes = report.getConditionAndOutcomesBySource();
assertThat(context.containsBean("negativeOuterPositiveInnerBean")).isFalse();
String negativeConfig = NegativeOuterConfig.class.getName();
ConditionAndOutcomes negativeOutcome = sourceOutcomes.get(negativeConfig);
assertThat(negativeOutcome).isNotNull();
assertThat(negativeOutcome.isFullMatch()).isFalse();
String positiveConfig = NegativeOuterConfig.PositiveInnerConfig.class.getName();
ConditionAndOutcomes positiveOutcome = sourceOutcomes.get(positiveConfig);
assertThat(positiveOutcome).isNotNull();
assertThat(positiveOutcome.isFullMatch()).isFalse();
}
@Test
void reportWhenSameShortNamePresentMoreThanOnceShouldUseFullyQualifiedName() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(UniqueShortNameAutoConfiguration.class,
org.springframework.boot.autoconfigure.condition.config.first.SampleAutoConfiguration.class,
org.springframework.boot.autoconfigure.condition.config.second.SampleAutoConfiguration.class);
context.refresh();
ConditionEvaluationReport report = ConditionEvaluationReport.get(context.getBeanFactory());
assertThat(report.getConditionAndOutcomesBySource()).containsKeys(
"org.springframework.boot.autoconfigure.condition.config.UniqueShortNameAutoConfiguration",
"org.springframework.boot.autoconfigure.condition.config.first.SampleAutoConfiguration",
"org.springframework.boot.autoconfigure.condition.config.second.SampleAutoConfiguration");
context.close();
}
@Test
void reportMessageWhenSameShortNamePresentMoreThanOnceShouldUseFullyQualifiedName() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(UniqueShortNameAutoConfiguration.class,
org.springframework.boot.autoconfigure.condition.config.first.SampleAutoConfiguration.class,
org.springframework.boot.autoconfigure.condition.config.second.SampleAutoConfiguration.class);
context.refresh();
ConditionEvaluationReport report = ConditionEvaluationReport.get(context.getBeanFactory());
String reportMessage = new ConditionEvaluationReportMessage(report).toString();
assertThat(reportMessage).contains("UniqueShortNameAutoConfiguration",
"org.springframework.boot.autoconfigure.condition.config.first.SampleAutoConfiguration",
"org.springframework.boot.autoconfigure.condition.config.second.SampleAutoConfiguration");
assertThat(reportMessage)
.doesNotContain("org.springframework.boot.autoconfigure.condition.config.UniqueShortNameAutoConfiguration");
context.close();
}
@Configuration(proxyBeanMethods = false)
@Conditional({ ConditionEvaluationReportTests.MatchParseCondition.class,
ConditionEvaluationReportTests.NoMatchBeanCondition.class })
static class NegativeOuterConfig {
@Configuration(proxyBeanMethods = false)
@Conditional({ ConditionEvaluationReportTests.MatchParseCondition.class })
static class PositiveInnerConfig {
@Bean
String negativeOuterPositiveInnerBean() {
return "negativeOuterPositiveInnerBean";
}
}
}
static class TestMatchCondition extends SpringBootCondition implements ConfigurationCondition {
private final ConfigurationPhase phase;
private final boolean match;
TestMatchCondition(ConfigurationPhase phase, boolean match) {
this.phase = phase;
this.match = match;
}
@Override
public ConfigurationPhase getConfigurationPhase() {
return this.phase;
}
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
return new ConditionOutcome(this.match, ClassUtils.getShortName(getClass()));
}
}
static class MatchParseCondition extends TestMatchCondition {
MatchParseCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION, true);
}
}
static class MatchBeanCondition extends TestMatchCondition {
MatchBeanCondition() {
super(ConfigurationPhase.REGISTER_BEAN, true);
}
}
static class NoMatchParseCondition extends TestMatchCondition {
NoMatchParseCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION, false);
}
}
static class NoMatchBeanCondition extends TestMatchCondition {
NoMatchBeanCondition() {
super(ConfigurationPhase.REGISTER_BEAN, false);
}
}
@Configuration(proxyBeanMethods = false)
@ImportAutoConfiguration({ MatchingAutoConfiguration.class, NonMatchingAutoConfiguration.class,
UnconditionalAutoConfiguration.class })
static class Config {
}
@AutoConfiguration
@ConditionalOnProperty(name = "com.example.property", matchIfMissing = true)
public static final class MatchingAutoConfiguration {
}
@AutoConfiguration
@ConditionalOnBean(Duration.class)
public static final class NonMatchingAutoConfiguration {
}
@AutoConfiguration
public static final class UnconditionalAutoConfiguration {
@Bean
String example() {
return "example";
}
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free