如何从 Spring 引导集成测试中使用 @RefreshScope 初始化 bean?
How can I initialize a bean with @RefreshScope from Spring Boot Integration tests?
我已经挠头好几个小时了。
Spring Cloud Netflix 自动配置 Eureka 客户端。以下片段来自 EurekaClientAutoConfiguration 的来源。
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
@org.springframework.cloud.context.config.annotation.RefreshScope
@Lazy
public EurekaClient eurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, EurekaInstanceConfig instance) {
applicationInfoManager.getInfo(); // force initialization
return new CloudEurekaClient(applicationInfoManager, config,
this.optionalArgs, this.context);
}
只有当我的 Spring 引导应用程序触发应用程序事件时才会初始化此 bean。
考虑到我正在 运行 JUnit 集成测试,这种情况不会发生。
这里是单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ReferentialClientTest.class)
public class InstrumentClientIT {
@Resource
private InstrumentClient instrumentClient;
@Test
public void testInstrumentClient() {
instrumentClient.findOne(455540l).getName();
}
}
InstrumentClient是一个依赖EurekaClient的Feign客户端。
这是测试配置 class。
@EnableFeignClients
@EnableDiscoveryClient
@EnableAutoConfiguration
public class ReferentialClientTest {
public static void main(String[] args) {
SpringApplication.run(ReferentialClientTest.class, args);
}
}
如何确保 EurekaClient 正确初始化而不将其连接到我的集成测试中? (这是我找到的唯一解决方法)。
因此,正如所发现的,您需要用 @WebIntegrationTest
注释您的 class。
我已经挠头好几个小时了。
Spring Cloud Netflix 自动配置 Eureka 客户端。以下片段来自 EurekaClientAutoConfiguration 的来源。
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
@org.springframework.cloud.context.config.annotation.RefreshScope
@Lazy
public EurekaClient eurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, EurekaInstanceConfig instance) {
applicationInfoManager.getInfo(); // force initialization
return new CloudEurekaClient(applicationInfoManager, config,
this.optionalArgs, this.context);
}
只有当我的 Spring 引导应用程序触发应用程序事件时才会初始化此 bean。
考虑到我正在 运行 JUnit 集成测试,这种情况不会发生。
这里是单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ReferentialClientTest.class)
public class InstrumentClientIT {
@Resource
private InstrumentClient instrumentClient;
@Test
public void testInstrumentClient() {
instrumentClient.findOne(455540l).getName();
}
}
InstrumentClient是一个依赖EurekaClient的Feign客户端。
这是测试配置 class。
@EnableFeignClients
@EnableDiscoveryClient
@EnableAutoConfiguration
public class ReferentialClientTest {
public static void main(String[] args) {
SpringApplication.run(ReferentialClientTest.class, args);
}
}
如何确保 EurekaClient 正确初始化而不将其连接到我的集成测试中? (这是我找到的唯一解决方法)。
因此,正如所发现的,您需要用 @WebIntegrationTest
注释您的 class。