使用Spring在单元测试中的用户生成线程上使用Hibernate

时间:2019-07-06 11:48:39

标签: unit-testing junit

该项目使用Spring和Hibernate。

我正在尝试同时测试还执行某些Hibernate查询的服务。我要做的是创建许多调用这些服务的任务,并将它们放在固定线程执行器中,这些执行器将并行运行它们。

持久层与Hibernate的SessionFactory(org.hibernate.SessionFactory)一起使用,因此例如,这就是我读取实体的方式:

MyEntity entity = sessionFactory.getCurrentSession().get(MyEntity.class, id);

这是我的测试配置方式:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:test-bundle-context.xml")
@Transactional()
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SomeTest {

  @Test
  public void profileSearchVerifySort() {
     // Do something
  }
}

我遇到的问题是,当从测试方法调用该服务并因此在主线程中运行时,它都能按预期运行,但是从ThreadPool线程调用时,我得到“ 无法获取事务” -当前线程的同步会话”。

我还尝试过手动创建这样的事务:

TransactionTemplate tmpl = new TransactionTemplate(txManager);
     tmpl.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
           myService.soStuff();
           sessionFactory.getCurrentSession().flush();
           sessionFactory.getCache().evictAll();
        }
     });

它处理交易问题。但是然后我又遇到了另一个问题,那就是我正在创建的事务似乎没有完成,并且在执行了上面的代码之后,在同一测试方法中,对实体的更新不可见。我不确定如何强制执行事务,因为我没有对此的引用。

总的来说,我们如何在线程中执行Hibernate代码,以便创建并提交事务?

0 个答案:

没有答案