Spring @PostConstruct 和@PreDestroy 的问题
Spring issue with @PostConstruct and @PreDestroy
我有一个 Spring 应用程序,我正在尝试使用 EmbededRedis 进行测试。所以我创建了一个如下所示的组件来在测试后初始化并杀死 redis。
@Component
public class EmbededRedis {
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(redisPort);
redisServer.start();
}
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
}
但是现在我遇到了一个奇怪的问题。因为 spring 缓存上下文,PreDestroy 不会在我的测试执行后每次都被调用,但由于某种原因,@PostConstruct 被调用,并且 EmbededRedis 尝试一次又一次地启动 运行 redis 服务器,这是在执行中创建问题。
有什么办法可以处理这种情况吗?
更新
这就是我主要定义测试的方式。
@SpringBootTest(classes = {SpringApplication.class})
@ActiveProfiles("test")
public class RedisApplicationTest {
抛弃 class 并编写一个 @Configuration
class 将 RedisServer
作为 bean 公开。
@Configuration
public void EmbeddedRedisConfiguration {
@Bean(initMethod="start", destroyMethod="stop")
public RedisServer embeddedRedisServer(@Value("${spring.redis.port}") int port) {
return new RedisServer(port);
}
}
所以我按照@M的建议调试了ContextInitialization。 Deinum.
对我来说,问题是,我们的应用程序正在模拟不同的 类,以便将模拟与 Spring 上下文混合。
现在,当您使用模拟时,MockitoContextInitializer
也会成为您的 cache key 的一部分,这会导致缓存未命中。原因是,mock 下的 类 对于不同的测试 类.
明显不同
看情况,我更愿意在测试完成后继续@DirtiesContext
使比赛无效,这样我可以稍后为不同的测试重新初始化上下文。
注意 @DirtiesContext
是一种建议避免的方式,因为它会减慢您的测试速度。
我有一个 Spring 应用程序,我正在尝试使用 EmbededRedis 进行测试。所以我创建了一个如下所示的组件来在测试后初始化并杀死 redis。
@Component
public class EmbededRedis {
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(redisPort);
redisServer.start();
}
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
}
但是现在我遇到了一个奇怪的问题。因为 spring 缓存上下文,PreDestroy 不会在我的测试执行后每次都被调用,但由于某种原因,@PostConstruct 被调用,并且 EmbededRedis 尝试一次又一次地启动 运行 redis 服务器,这是在执行中创建问题。
有什么办法可以处理这种情况吗?
更新 这就是我主要定义测试的方式。
@SpringBootTest(classes = {SpringApplication.class})
@ActiveProfiles("test")
public class RedisApplicationTest {
抛弃 class 并编写一个 @Configuration
class 将 RedisServer
作为 bean 公开。
@Configuration
public void EmbeddedRedisConfiguration {
@Bean(initMethod="start", destroyMethod="stop")
public RedisServer embeddedRedisServer(@Value("${spring.redis.port}") int port) {
return new RedisServer(port);
}
}
所以我按照@M的建议调试了ContextInitialization。 Deinum.
对我来说,问题是,我们的应用程序正在模拟不同的 类,以便将模拟与 Spring 上下文混合。
现在,当您使用模拟时,MockitoContextInitializer
也会成为您的 cache key 的一部分,这会导致缓存未命中。原因是,mock 下的 类 对于不同的测试 类.
看情况,我更愿意在测试完成后继续@DirtiesContext
使比赛无效,这样我可以稍后为不同的测试重新初始化上下文。
注意 @DirtiesContext
是一种建议避免的方式,因为它会减慢您的测试速度。