我Clock像這樣配置一個bean:
@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實際上會解決這個問題?
uj5u.com熱心網友回復:
從 Spring boot 2.0 及更高版本開始,您必須在 application.yml 中啟用 bean 覆寫,以允許 SpringClock在集成測驗中使用您想要的實體覆寫來自實際應用程式的實體:
spring:
main:
allow-bean-definition-overriding: true
uj5u.com熱心網友回復:
似乎有幾種解決方法可用。
1:設定spring.main.allow-bean-definition-overriding=true上src/test/resources/application.properties(或對application-test.properties;您激活test組態檔)。
2:如果@Qualifier沒有在自動裝配上指定,則將測驗bean定義為@Primary不同的bean名稱:
@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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/342753.html
