0

如何在 junit 运行时测试期间使用多个数据源和 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); 
  }
..
 }
4

1 回答 1

3

2 个数据库 => 2 个会话工厂和数据源。这目前在您的代码中是不可能的。

我假设您有 1 ProductStatService,但您的要求是此服务将与sessionfactoryA 一起用于“选择”和sessionfactoryB用于“插入”。

因此,您需要在单元测试中创建(并注入)该服务的 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
    }
}

}

但是,您仍然需要在您的服务中注入此 DAO 的 2 个不同实例(因此 scope='prototype')。

于 2011-10-31T10:01:21.377 回答