2011-10-31 9 views
0

junitランタイムテストで複数のdatasouceおよびsessionFactoryを使用するにはどうすればよいですか?junitランタイムテスト中に複数のdatasouceおよびsessionFactoryを使用する方法

は私が永続化のためhibernateDaoTemplateを使用し、私の構造は、右のダウンここにある:

私はちょうど別のDBから、たとえば、製品を取得し、ProductStatServiceTestランタイムで異なるデシベルにそれらを保持したい

ありがとうございます。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/dataSource.xml", "/hibernate.xml", "/applicationContext.xml"}) 
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class}) 
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true) 
public abstract class GenericTransactionalUnitTest extends AbstractTransactionalJUnit4SpringContextTests { 
    private Session session; 

    protected abstract SessionFactory getSessionFactory(); 
    ... 
} 

@Transactional(readOnly = true) 
abstract public class ProductStatUnitTest extends GenericTransactionalUnitTest { 
    @Autowired 
    @Qualifier(value = "productStatSessionFactory") 
    private SessionFactory sessionFactory; 

    @Resource(name = "productStatDS") 
    public void setDataSource(DataSource dataSource) { 
    super.setDataSource(dataSource); 
    } 

    @Override 
    protected SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

public class ProductStatServiceTest extends ProductStatUnitTest { 
    @Autowired 
    private ProductStatService productStatService; 

    @Test 
    public List<ProductStat> testInjection() throws ParseException { 
    productStatService.findById(123456); 
    } 
.. 
} 

答えて

3

2データベース=> 2セッションファクトリとデータソース。現在のところ、これはあなたのコードでは不可能です。

私はあなたが1 ProductStatServiceを持っていると仮定しますが、あなたの要件は、このサービスは「選択」と「挿入」のsessionfactoryBためsessionfactoryAで動作することです。

したがって、ユニットテストでこのサービスの2つのインスタンスを作成(および注入)する必要があります。これらはもちろん、シングルトンとしてスコープすることはできません(DI用にSpringを使用すると仮定します)。
コードの一部を書き直す必要があります。実際のセッションファクトリーをサービスに追加し、GenericTransactionalUnitTest.getSessionFactory()で取得する必要はありません。

UPDATE

あなたは2 DAOの、これはまた、オプションを作成したくない場合は、次の

public class ProductStatDAO extends AbstractHibernateDao { 

@Autowired(required = false) 
@Qualifier("sessionFactoryA") 
private SessionFactory sessionFactoryA; 

@Autowired(required = false) 
@Qualifier("sessionFactoryB") 
private SessionFactory sessionFactoryB; 

//called by Spring (init-method) 
public void init() { 
    if (getSessionFactory() == null) { 
     if (sessionFactoryA != null) { 
      setSessionFactory(sessionFactoryA); 
     } else if (sessionFactoryB != null) { 
      setSessionFactory(sessionFactoryB); 
     } 
     // else throw exception 
    } 
} 

}

をただし、まだ2つの異なるインスタンスを注入する必要があります。あなたのサービスのこのDAO(スコープ= 'プロトタイプ')。

+0

ありがとうございます。 1つのテストクラスに異なるセッションファクトリを注入するにはどうすればよいですか?テストクラスではなく、サービスクラスにsessionFactoryを保持することをお勧めしますか? – Javatar

+0

次に、さまざまなデータソースを設定するにはどうすればよいですか? – Javatar

+1

実際には、セッションファクトリーはDAOレベルでは使用されません。あなたのサービスは、休止状態が永続性のために使用されていることを認識してはいけません。最良の選択肢はおそらく、2つのDAO(1つは取得し、もう1つはプロダクト・スタットを保持する)で、別のセッションファクトリー(DB-A用に構成されたものとDB-B用に構成されたもの)を注入することです。実際の(J2EE)トランザクションマネージャ(WebsphereやJBossなど)を持っていない限り、2つのDBを1つのトランザクション内で使用することはできません。 TomcatまたはJettyを使用している場合は、これを可能にするためにAtomikosを統合する必要があります。 –

関連する問題