在Spring Framework 5.1中注册具有相同名称的测试bean。

8 浏览
0 Comments

在Spring Framework 5.1中注册具有相同名称的测试bean。

我在生产文件中有以下配置:

@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?

0
0 Comments

问题原因:Spring Framework 5.1中的问题是在注册测试bean时使用了相同的名称,这会导致bean的重复定义。

解决方法:可以使用properties属性来设置spring.main.allow-bean-definition-overriding=true。这个属性可以允许bean的重复定义。

这个解决方法非常棒。我想知道为什么在使用时这个选项不默认设置为true

这个选项默认情况下没有启用,因为这可能会导致你的测试通过,即使你的应用程序由于重复的bean而无法启动。

0