如何在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);
}
..
}
答案 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')。