Dariusz Kuc
08/19/2020, 6:01 PMBeanDefinitionBuilder.genericBeanDefinition(MyFactoryBean::class.java)
• MyFactoryBean
is application context aware and it attempts to retrieve FallbackBean
from context (e.g. using applicationContext.getBean(FallbackBean::class.java)
• within a @SpringBootTest
I’m explicitly creating SomeBean
in a configuration class
So my problem is that conditional logic (i.e. @ConditionalOnBean
) is evaluated BEFORE attempting to create the SomeBean
in test configuration…. Sample code in the thread. Any ideas what I might be missing?Dariusz Kuc
08/19/2020, 6:01 PM@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
@Import(MyBeanRegistrar::class, MyFallbackConfiguration::class)
@EnableConfigurationProperties(MyProperties::class)
annotation class EnableMyAutoConfiguration
@ConditionalOnBean(SomeBean::class)
@Configuration
class MyFallbackConfiguration {
@Bean
@ConditionalOnMissingBean
fun fallbackBean(someBean: SomeBean): FallbackBean = DefaultFallbackBean(someBean)
}
@SpringBootTest(classes = [MyConfigurationIT.MyTestConfiguration::class])
class MyConfigurationIT {
@Configuration
@EnableAutoConfiguration
@EnableMyAutoConfiguration
class MyTestConfiguration {
@Bean
fun someBean(): SomeBean = SomeBean() // <== this gets created AFTER conditional evaluation
}
@Test
fun `context loads`() {
}
}
Dariusz Kuc
08/20/2020, 11:18 PMMyFallbackConfiguration
a spring auto configuration (i.e. configuring it in META-INF/spring.factories
and removing the explicit import from the annotation)