2017-11-28 62 views
0

実行時にクラスを1つしか使用しません(テストを実行しているか、サーバー上でアプリケーションを実行しているかによって異なります)もう1つはSpringのComponent Scanningのものです。SpringBootのComponentScanからクラスを除外する

ここでは、テスト時に、私が使用したいファーストクラス:

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セットアップと互換性のあるソリューションが必要です。これにより、展開がスムーズで手間のかからないようにすることができます。

答えて

0

プロファイルで作業することができます。

これは、Aのように働いた... @ActiveProfiles("test")および統合@Profile("test")とテストと私は今、とても愚かな感じ@Profile("!test")

+0

との統合テストのためにロードされるべきではないコンポーネントのためにロードする必要があるコンポーネントを使用して統合テストに注釈を付けますチャーム。ありがとう@Yannic –

+0

それはあなたのために働いてうれしい。しかし、テストに必要な豆だけを最低限に保つようにしてください。これは本当に乱雑になる可能性があるためです。さらに、@Profileアノテーションは、アプリケーションの起動時に評価される必要があり、起動が遅くなります(EVEN IN PRODUCTION!) –

+0

注目。いずれにせよ、上記のクラスだけがプロファイリングを必要とするクラスです。残りのいずれかが必要です。 –

関連する問題