Исключить класс из ComponentScan в SpringBoot

У меня есть два класса, из которых я хочу использовать только один класс во время выполнения (в зависимости от того, запускаю ли я тесты или запускаю приложение на сервере (локальном или ином)) и исключаю другой из компонента Spring Scanning Scanning.

Вот 1-й класс, который я хочу использовать при тестировании:

public class HibernateUtilForH2 implements HibernateUtil {
private static SessionFactory sessionFactory;
static {
    try {
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml.h2");
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(builder.build());

    } catch (Exception ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public Session openSession() {
    return sessionFactory.openSession();
    }
}

Вот второй класс для использования во время производства или локального исполнения:

public class HibernateUtilForMySql implements HibernateUtil {

private static final SessionFactory sessionFactory;
static {
    try {
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(builder.build());

    } catch (Exception ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

HibernateUtil вот интерфейс, содержащий объявление openSession() только метод.

я хочу HibernateUtilForH2 вводиться с помощью DI при тестировании и HibernateUtilForMySql использоваться для производства или исполнения на локальном сервере. Как я могу это сделать?

Я пытался использовать @TestComponent а также @ConditionalOnWebApplication но ни один из них не работает. Мне нужно решение, которое совместимо с настройкой GitLab для CI/CD, чтобы развертывание могло быть плавным и беспроблемным.

1 ответ

Решение

Вы могли бы работать с профилями.

Аннотируйте свой интеграционный тест с помощью @ActiveProfiles("test") и ваш компонент, который должен быть загружен для интеграционных тестов с @Profile("test") и компоненты, которые не должны быть загружены для интеграционных тестов с @Profile("!test")

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