Spring Boot AutoConfigure provides auto-configuration capabilities that automatically configure Spring applications based on jar dependencies present on the classpath
—
Comprehensive guide to testing Spring Boot auto-configurations.
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class MyAutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
MyAutoConfiguration.class
));
}@Test
void serviceIsAutoConfigured() {
contextRunner.run(context -> {
assertThat(context).hasSingleBean(MyService.class);
});
}@Test
void serviceConfiguredWithProperties() {
contextRunner
.withPropertyValues(
"myservice.enabled=true",
"myservice.timeout=60"
)
.run(context -> {
MyService service = context.getBean(MyService.class);
assertThat(service.getTimeout()).isEqualTo(60);
});
}@Test
void serviceNotConfiguredWhenDisabled() {
contextRunner
.withPropertyValues("myservice.enabled=false")
.run(context -> {
assertThat(context).doesNotHaveBean(MyService.class);
});
}@Test
void userConfigurationTakesPrecedence() {
contextRunner
.withUserConfiguration(UserConfiguration.class)
.run(context -> {
assertThat(context).hasSingleBean(MyService.class);
assertThat(context.getBean(MyService.class))
.isInstanceOf(CustomMyService.class);
});
}
@Configuration
static class UserConfiguration {
@Bean
public MyService myService() {
return new CustomMyService();
}
}@Test
void autoConfigurationWithDataSource() {
contextRunner
.withConfiguration(AutoConfigurations.of(
DataSourceAutoConfiguration.class,
MyDatabaseAutoConfiguration.class
))
.withPropertyValues("spring.datasource.url=jdbc:h2:mem:test")
.run(context -> {
assertThat(context).hasSingleBean(DataSource.class);
assertThat(context).hasSingleBean(DatabaseInitializer.class);
});
}@Test
void autoConfigurationRunsAfterDataSource() {
contextRunner
.withConfiguration(AutoConfigurations.of(
DataSourceAutoConfiguration.class,
MyAutoConfiguration.class
))
.run(context -> {
// Verify order-dependent behavior
});
}@Test
void failsWhenRequiredPropertyMissing() {
contextRunner
.run(context -> {
assertThat(context).hasFailed();
assertThat(context.getStartupFailure())
.hasMessageContaining("required property");
});
}