如何在junit运行时测试期间使用多个数据源和sessionFactory

时间:2011-10-31 09:46:03

标签: hibernate spring junit 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); 
  }
..
 }

1 个答案:

答案 0 :(得分:3)

2数据库=&gt; 2个会议工厂和数据源。目前您的代码中无法使用此功能。

我假设您有1个ProductStatService,但您的要求是此服务将与 sessionfactoryA 一起用于'select'和 sessionfactoryB 用于'insert' 。

因此,您需要在单元测试中创建(并注入)此服务的2个实例,当然这些实例不能用作单例(假设您使用Spring作为DI)。
您将不得不重写一些代码,实际的sessionfactory将需要注入服务而不是GenericTransactionalUnitTest.getSessionFactory()检索。

<强>更新

如果您不想创建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')。