gpt4 book ai didi

java - 使用Spring集成测试时如何控制@PostConstruct

转载 作者:行者123 更新时间:2023-11-30 07:53:13 26 4
gpt4 key购买 nike

我有 spring bean 类 RedisRepo在里面我正在使用@PostConstruct初始化我的数据库连接:

 @PostConstruct
public void init() {
logger.debug("RedisRepo, Init.");
client = new RedisClient(REDIS_HOST, REDIS_PORT);
...
}

我正在 SpringConfiguration.class 中使用 java 配置创建此 bean:

 @Bean
@Scope("singleton")
public RedisRepo redisjRepo() {
return new RedisRepo();
}

我开始使用 Spring 构建集成测试。我使用相同的配置类(SpringConfiguration.class)进行测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringConfiguration.class)

我的测试类使用嵌入式redis,因此我需要在开始测试之前初始化它:

 @Before
public void init() throws IOException {
//init embedded-redis
}

问题是当我开始测试时,RedisRepo 类的 @PostConstruct 在我的集成测试 init() 类(下面)之前执行,这导致我为 null,因为我的嵌入式 redis 尚未初始化。

我该如何避免呢?也许我没有做正确的事情?

谢谢,射线。

最佳答案

我建议考虑使用 spring Boot 自动配置(@EnableAutoConfiguration@SpringBootApplication)来初始化 Redis 连接。您可以使用这些 Spring Boot properties自定义Redis:

# REDIS (RedisProperties)
spring.redis.database= # database name
spring.redis.host=localhost # server host
spring.redis.password= # server password
spring.redis.port=6379 # connection port
spring.redis.pool.max-idle=8 # pool settings ...
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.sentinel.master= # name of Redis server
spring.redis.sentinel.nodes= # comma-separated list of host:port pairs

这将消除在 @PostConstruct 生产代码中进行连接初始化的需要,您只需从上下文除尘测试中 Autowiring 与 Redis 相关的 bean。

编辑1:

要在测试方法之前填充 Redis 实例,您可以使用 @BeforeMethod (使用 TestNg)或 @Before (使用 JUnit)。要在测试之前但在初始化上下文之后填充它,请在测试类中使用@PostConstruct。

编辑2:

您询问通用规则如何克服 @PostConstruct 中资源初始化的需要。我相信你的问题是如何在你的应用程序中连接bean。

您的@PostConstruct初始化是在其他bean中完成的,其中RedisClient存储为变量client。我认为这很可能是各种担忧的混合。如果您以这种方式将 RedisClient bean 注册到 spring 上下文中:

@Bean
public RedisClient redisClient() {
RedisClient client = new RedisClient(REDIS_HOST, REDIS_PORT);
...
return client;
}

您可以将其 Autowiring 到已进行 @PostConstruct 初始化的 bean 中。您还可以在测试期间自动连接它。如果 RedisClient 不是线程安全的,您可能需要考虑它的原型(prototype)或请求范围。

通过这种方法,我很少使用 @PostConstruct 并使用 Spring IoC 容器来处理所有可重用的资源实例。

关于java - 使用Spring集成测试时如何控制@PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33052102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com