2011-10-31 17 views
0

如何在junit運行時測試期間使用多個datasouce和sessionFactory?如何在junit運行時測試期間使用多個datasouce和sessionFactory

我用hibernateDaoTemplate持久性,而我的結構就在這裏:

我只是想從不同的數據庫獲取,比如說產品,然後他們堅持在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但你的要求是,這項服務將與sessionfactoryA工作的「選擇」和sessionfactoryB爲「插入」。因此,你將需要在你的單元測試中創建(並注入)這個服務的2個實例,當然這些實例不能作爲單例(假設你使用Spring的DI)。
您將不得不重寫一些代碼,實際的sessionfactory將需要注入到服務中,並且不會被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(所以scope ='prototype')在你的服務中。

+0

首先感謝。我如何在一個測試課上注入不同的會話工廠?你有關將sessionFactory保留在服務類而不是測試類的建議嗎? – Javatar

+0

那我該如何設置不同的數據源? – Javatar

+1

實際上,DAO級別都使用sessionfactory;你的服務甚至不應該意識到hibernate被用於持久化。最好的選擇是可能有2個DAO(一個檢索一個持久化productstats)並在其中注入不同的sessionfactory(一個針對DB-A配置,另一個針對DB-B)。請注意,除非您擁有真正的(J2EE)事務管理器(如Websphere或JBoss),否則不能在1個事務中使用2個DB。如果你使用Tomcat或Jetty,你將不得不整合Atomikos來實現這一點。 –

相關問題