为集成测试/@SpringBootTest提供bean时出现BeanDefinitionOverrideExceptio



我这样配置Clockbean:

@Configuration
public class ClockConfiguration {
@Bean
Clock clock() {
return Clock.systemDefaultZone();
}
}

然而,对于集成测试,我需要一个具有固定时间的Clock实例,所以我添加了一个静态@TestConfiguration,如下所示:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = WireMockInitializer.class)
@AutoConfigureWebTestClient
@ActiveProfiles("test")
class MyIT {
@TestConfiguration
static class ClockTestConfiguration {
@Bean
public Clock clock() {
return Clock.fixed(Instant.ofEpochMilli(1635513004000L), ZoneId.systemDefault());
}
}
@Autowired
WireMockServer wireMockServer;
@Autowired
private WebTestClient webTestClient;
@AfterEach
void afterEach() {
wireMockServer.resetAll();
}
@Test
void testFoo() {}
}

但是在运行测试时,无法加载应用程序上下文。相反,显示此错误消息:

org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'clock' defined in de.myapp.MyIT$ClockTestConfiguration
There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=clockConfiguration; factoryMethodName=clock; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [de/myapp/ClockConfiguration.class]] bound.

我的理解是,静态@TestConfiguration实际上会解决这个问题吗?

从Spring boot 2.0及更高版本开始,您必须在application.yml中启用bean覆盖,以允许Spring在集成测试中使用您想要的实例来覆盖实际应用程序中的Clock实例:

spring:
main:
allow-bean-definition-overriding: true

似乎有几个解决方案可用。

1:在src/test/resources/application.properties上设置spring.main.allow-bean-definition-overriding=true(或在application-test.properties上;您可以激活test配置文件)。

2:如果在自动布线上没有指定@Qualifier,则将测试bean定义为具有不同bean名称的@Primary

@TestConfiguration
static class ClockTestConfiguration {
@Bean("fixedClock")
@Primary
public Clock clock() {
return Clock.fixed(Instant.ofEpochMilli(1635513004000L), ZoneId.systemDefault());
}
}

另请参阅:

  • Spring Boot 2.1.0错误的BeanDefinitionOverrideException#15045

相关内容

  • 没有找到相关文章

最新更新