0

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); 
  }
..
 }
4

1 に答える 1

3

2データベース=>2セッションファクトリとデータソース。現在、これはコードでは不可能です。

私はあなたが1を持っていると仮定しますがProductStatService、あなたの要件は、このサービスが「選択」のためのsessionfactoryAと「挿入」の ためのsessionfactoryBで動作することです。

したがって、単体テストでこのサービスの2つのインスタンスを作成(および挿入)する必要があります。もちろん、これらをシングルトンとしてスコープすることはできません(Spring for 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 に答える