spring发布@postconstruct和@predestroy

6mzjoqzu  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(384)

我有一个spring应用程序,我正试图用embedderedis测试它。所以我创建了一个如下的组件,在测试之后初始化并杀死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会被调用,embedderedis会一次又一次地尝试启动正在运行的redis服务器,这就是执行中的creatimg问题。
有没有办法处理这种情况?
更新这是我主要如何定义我的测试。

@SpringBootTest(classes = {SpringApplication.class})
@ActiveProfiles("test")
public class RedisApplicationTest {
oogrdqng

oogrdqng1#

别上课了,写一篇文章 @Configuration 暴露的类别 RedisServer 像豆子一样。

@Configuration
public void EmbeddedRedisConfiguration {

   @Bean(initMethod="start", destroyMethod="stop")
   public RedisServer embeddedRedisServer(@Value("${spring.redis.port}") int port) {
      return new RedisServer(port);
   }
}
ztmd8pv5

ztmd8pv52#

所以我按照@m的建议调试了contextinitialization。迪纳姆。
对我来说,问题是,我们的应用程序模拟不同的类,以便将模拟与spring上下文混合。现在,当你使用mock时, MockitoContextInitializer 也会成为缓存密钥的一部分,从而导致缓存未命中。原因是,对于不同的测试类,mock下的类明显不同。
从目前的情况来看,我更愿意继续 @DirtiesContext 在测试完成后使竞赛无效,以便稍后可以为不同的测试重新初始化上下文。
笔记 @DirtiesContext 在某种程度上建议避免,因为它会减慢测试速度。

相关问题