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 是一种建议避免的方式,因为它会减慢您的测试速度。