как использовать несколько datasouce и sessionFactory во время теста времени выполнения junit - PullRequest
0 голосов
/ 31 октября 2011

Как использовать несколько datasouce и sessionFactory во время теста времени выполнения junit?

Я использую 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 Ответ

3 голосов
/ 31 октября 2011

2 База данных => 2 сеансовых фабрик и источников данных. В настоящее время это невозможно в вашем коде.

Я предполагаю, что у вас есть 1 ProductStatService, но вы требуете, чтобы эта служба работала с sessionfactoryA для 'select' и sessionfactoryB для 'insert'.

Следовательно, вам нужно будет создать (и внедрить) 2 экземпляра этого сервиса в вашем модульном тесте, и они, конечно, не могут быть определены как одиночные (при условии, что вы используете Spring для DI).
Вам придется переписать часть вашего кода, фактическую сессионную фабрику нужно будет внедрить в сервис, а не получить 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') в вашу службу.

...