-1

我有一个 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 {
4

2 回答 2

2

抛弃类并编写一个@Configuration暴露RedisServer为 bean 的类。

@Configuration
public void EmbeddedRedisConfiguration {

   @Bean(initMethod="start", destroyMethod="stop")
   public RedisServer embeddedRedisServer(@Value("${spring.redis.port}") int port) {
      return new RedisServer(port);
   }
}
于 2020-08-19T11:25:22.507 回答
0

所以我按照@M 的建议调试了 ContextInitialization。迪南。

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

考虑到这种情况,我更愿意@DirtiesContext在测试完成后继续使比赛无效,以便稍后我可以为不同的测试重新初始化上下文。

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

于 2020-08-19T13:46:43.283 回答