繁体   English   中英

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。 迪南。

对我来说,问题是,我们的应用程序是 mocking 不同的类,以便将 mocking 与 Spring 上下文混合。 现在,当您使用模拟时, MockitoContextInitializer也会成为您缓存键的一部分,这会导致缓存未命中。 原因是,对于不同的测试类,mock 下的类明显不同。

看情况,我更喜欢 go 在测试完成后使用@DirtiesContext使比赛无效,以便稍后我可以重新初始化上下文以进行不同的测试。

注意@DirtiesContext建议避免使用,因为它会减慢测试速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM