本番ファイルに次の設定があります:
@Configuration
internal class Config {
@Bean
fun clock() = Clock.systemUTC()
}
テストでは:
@Configuration
class ClockTestConfiguration {
@Bean
fun clock() = SetableClock()
}
私のテストアノテーション:
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = [
MyApplication::class,
ClockTestConfiguration::class
]
)
class MyTest {
...
Spring Boot 2.0.5.RELEASE
を使用していたとき、それは魅力のように機能しました。 2.1.0.RELEASE
にアップグレードした後、Beanの登録中に失敗します。
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'clock' defined in com.foo.clock.ClockTestConfiguration:
Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=clockTestConfiguration; factoryMethodName=clock; initMethodName=null; destroyMethodName=(inferred);
defined in com.foo.clock.ClockTestConfiguration] for bean 'clock': There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=config; factoryMethodName=clock; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/foo/clock/Config.class]] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.Java:894)
そのようなBeanをオーバーライドするクリーンな方法はありますか?
@SpringBootTest
のproperties
属性を使用して、spring.main.allow-bean-definition-overriding=true
を設定できます。