Проблема 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
рекомендуется избегать, так как это замедляет ваши тесты.