Skip to content

Commit c849caf

Browse files
committed
Further improve independence of core auto-configuration tests
See gh-44513
1 parent 6cf81e2 commit c849caf

File tree

3 files changed

+104
-28
lines changed

3 files changed

+104
-28
lines changed

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportTests.java

+44-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.condition;
1818

19+
import java.time.Duration;
1920
import java.util.Iterator;
2021
import java.util.Map;
2122

@@ -27,12 +28,12 @@
2728

2829
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2930
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
31+
import org.springframework.boot.autoconfigure.AutoConfiguration;
32+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3033
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcome;
3134
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcomes;
3235
import org.springframework.boot.autoconfigure.condition.config.UniqueShortNameAutoConfiguration;
3336
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportMessage;
34-
import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
35-
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
3637
import org.springframework.boot.test.util.TestPropertyValues;
3738
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3839
import org.springframework.context.annotation.Bean;
@@ -41,7 +42,6 @@
4142
import org.springframework.context.annotation.Conditional;
4243
import org.springframework.context.annotation.Configuration;
4344
import org.springframework.context.annotation.ConfigurationCondition;
44-
import org.springframework.context.annotation.Import;
4545
import org.springframework.core.type.AnnotatedTypeMetadata;
4646
import org.springframework.util.ClassUtils;
4747

@@ -163,7 +163,17 @@ private void prepareMatches(boolean m1, boolean m2, boolean m3) {
163163
void springBootConditionPopulatesReport() {
164164
ConditionEvaluationReport report = ConditionEvaluationReport
165165
.get(new AnnotationConfigApplicationContext(Config.class).getBeanFactory());
166-
assertThat(report.getConditionAndOutcomesBySource()).isNotEmpty();
166+
assertThat(report.getUnconditionalClasses()).containsExactly(UnconditionalAutoConfiguration.class.getName());
167+
assertThat(report.getConditionAndOutcomesBySource()).containsOnlyKeys(MatchingAutoConfiguration.class.getName(),
168+
NonMatchingAutoConfiguration.class.getName());
169+
assertThat(report.getConditionAndOutcomesBySource().get(MatchingAutoConfiguration.class.getName()))
170+
.satisfies((outcomes) -> assertThat(outcomes).extracting(ConditionAndOutcome::getOutcome)
171+
.extracting(ConditionOutcome::isMatch)
172+
.containsOnly(true));
173+
assertThat(report.getConditionAndOutcomesBySource().get(NonMatchingAutoConfiguration.class.getName()))
174+
.satisfies((outcomes) -> assertThat(outcomes).extracting(ConditionAndOutcome::getOutcome)
175+
.extracting(ConditionOutcome::isMatch)
176+
.containsOnly(false));
167177
}
168178

169179
@Test
@@ -230,18 +240,6 @@ void reportMessageWhenSameShortNamePresentMoreThanOnceShouldUseFullyQualifiedNam
230240
context.close();
231241
}
232242

233-
@Configuration(proxyBeanMethods = false)
234-
@Import(WebMvcAutoConfiguration.class)
235-
static class Config {
236-
237-
}
238-
239-
@Configuration(proxyBeanMethods = false)
240-
@Import(MultipartAutoConfiguration.class)
241-
static class DuplicateConfig {
242-
243-
}
244-
245243
@Configuration(proxyBeanMethods = false)
246244
@Conditional({ ConditionEvaluationReportTests.MatchParseCondition.class,
247245
ConditionEvaluationReportTests.NoMatchBeanCondition.class })
@@ -315,4 +313,33 @@ static class NoMatchBeanCondition extends TestMatchCondition {
315313

316314
}
317315

316+
@Configuration(proxyBeanMethods = false)
317+
@ImportAutoConfiguration({ MatchingAutoConfiguration.class, NonMatchingAutoConfiguration.class,
318+
UnconditionalAutoConfiguration.class })
319+
static class Config {
320+
321+
}
322+
323+
@AutoConfiguration
324+
@ConditionalOnProperty(name = "com.example.property", matchIfMissing = true)
325+
static class MatchingAutoConfiguration {
326+
327+
}
328+
329+
@AutoConfiguration
330+
@ConditionalOnBean(Duration.class)
331+
static class NonMatchingAutoConfiguration {
332+
333+
}
334+
335+
@AutoConfiguration
336+
static class UnconditionalAutoConfiguration {
337+
338+
@Bean
339+
String example() {
340+
return "example";
341+
}
342+
343+
}
344+
318345
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/logging/ConditionEvaluationReportLoggerTests.java

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.logging;
1818

19+
import java.time.Duration;
1920
import java.util.Arrays;
2021

2122
import ch.qos.logback.classic.Level;
@@ -25,12 +26,16 @@
2526
import org.junit.jupiter.api.extension.ExtendWith;
2627
import org.slf4j.LoggerFactory;
2728

29+
import org.springframework.boot.autoconfigure.AutoConfiguration;
30+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
2831
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport;
29-
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListenerTests.Config;
32+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
33+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3034
import org.springframework.boot.logging.LogLevel;
3135
import org.springframework.boot.test.system.CapturedOutput;
3236
import org.springframework.boot.test.system.OutputCaptureExtension;
3337
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
38+
import org.springframework.context.annotation.Configuration;
3439

3540
import static org.assertj.core.api.Assertions.assertThat;
3641
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
@@ -104,7 +109,8 @@ void logsOutput(CapturedOutput output) {
104109
ConditionEvaluationReport.get(context.getBeanFactory()).recordExclusions(Arrays.asList("com.foo.Bar"));
105110
context.refresh();
106111
withDebugLogging(() -> logger.logReport(false));
107-
assertThat(output).contains("not a servlet web application (OnWebApplicationCondition)");
112+
assertThat(output).contains("did not find any beans of type java.time.Duration (OnBeanCondition)")
113+
.contains("@ConditionalOnProperty (com.example.property) matched (OnPropertyCondition)");
108114
}
109115
}
110116

@@ -121,4 +127,22 @@ private void withDebugLogging(Runnable runnable) {
121127
}
122128
}
123129

130+
@Configuration(proxyBeanMethods = false)
131+
@ImportAutoConfiguration({ MatchingAutoConfiguration.class, NonMatchingAutoConfiguration.class })
132+
static class Config {
133+
134+
}
135+
136+
@AutoConfiguration
137+
@ConditionalOnProperty(name = "com.example.property", matchIfMissing = true)
138+
static class MatchingAutoConfiguration {
139+
140+
}
141+
142+
@AutoConfiguration
143+
@ConditionalOnBean(Duration.class)
144+
static class NonMatchingAutoConfiguration {
145+
146+
}
147+
124148
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/logging/ConditionEvaluationReportLoggingListenerTests.java

+33-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2024 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.logging;
1818

19+
import java.time.Duration;
20+
1921
import ch.qos.logback.classic.Level;
2022
import ch.qos.logback.classic.Logger;
2123
import ch.qos.logback.classic.LoggerContext;
@@ -24,18 +26,18 @@
2426
import org.slf4j.LoggerFactory;
2527

2628
import org.springframework.boot.SpringApplication;
29+
import org.springframework.boot.autoconfigure.AutoConfiguration;
30+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
2731
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport;
28-
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
29-
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
30-
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
32+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
33+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3134
import org.springframework.boot.context.event.ApplicationFailedEvent;
3235
import org.springframework.boot.test.system.CapturedOutput;
3336
import org.springframework.boot.test.system.OutputCaptureExtension;
3437
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext;
3538
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3639
import org.springframework.context.annotation.Bean;
3740
import org.springframework.context.annotation.Configuration;
38-
import org.springframework.context.annotation.Import;
3941
import org.springframework.mock.web.MockServletContext;
4042

4143
import static org.assertj.core.api.Assertions.assertThat;
@@ -126,14 +128,15 @@ private void withLoggingLevel(Level logLevel, Runnable runnable) {
126128
}
127129

128130
@Configuration(proxyBeanMethods = false)
129-
@Import({ WebMvcAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class,
130-
PropertyPlaceholderAutoConfiguration.class })
131+
@ImportAutoConfiguration({ MatchingAutoConfiguration.class, NonMatchingAutoConfiguration.class,
132+
UnconditionalAutoConfiguration.class })
131133
static class Config {
132134

133135
}
134136

135137
@Configuration(proxyBeanMethods = false)
136-
@Import(WebMvcAutoConfiguration.class)
138+
@ImportAutoConfiguration({ MatchingAutoConfiguration.class, NonMatchingAutoConfiguration.class,
139+
UnconditionalAutoConfiguration.class })
137140
static class ErrorConfig {
138141

139142
@Bean
@@ -143,4 +146,26 @@ String iBreak() {
143146

144147
}
145148

149+
@AutoConfiguration
150+
@ConditionalOnProperty(name = "com.example.property", matchIfMissing = true)
151+
static class MatchingAutoConfiguration {
152+
153+
}
154+
155+
@AutoConfiguration
156+
@ConditionalOnBean(Duration.class)
157+
static class NonMatchingAutoConfiguration {
158+
159+
}
160+
161+
@AutoConfiguration
162+
static class UnconditionalAutoConfiguration {
163+
164+
@Bean
165+
String example() {
166+
return "example";
167+
}
168+
169+
}
170+
146171
}

0 commit comments

Comments
 (0)