Проблема Spring с @PostConstruct и @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 {

2 ответа

Бросьте класс и напишите @Configuration класс, который выставил RedisServer как боб.

@Configuration
public void EmbeddedRedisConfiguration {

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

Итак, я отладил ContextInitialization, как было предложено @M. Деинум.

Для меня проблема заключалась в том, что наше приложение имитировало разные классы, чтобы смешать имитацию с контекстом Spring. Теперь, когда вы используете mocks,MockitoContextInitializerтакже становится частью вашего ключа кеша, что приводит к пропуску кеша. Причина в том, что классы под mock явно разные для разных тестовых классов.

Глядя на ситуацию, я предпочел продолжить @DirtiesContext чтобы сделать конкурс недействительным после завершения теста, чтобы я мог повторно инициализировать контекст позже для другого теста.

Заметка @DirtiesContext рекомендуется избегать, так как это замедляет ваши тесты.

Другие вопросы по тегам