2012-11-21 70 views
1

您好我有一个单元测试应该测试的cronjob弹簧非事务性单元测试和休眠

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:WebContent/WEB-INF/applicationContext.xml" }) 
@TransactionConfiguration(transactionManager = "hibernateTransactionManager") 
@Transactional 
public class cronTest {} 

但由于的cronjob没有看到测试的数据交易。但是,当我删除@Transactional休眠说:

org.hibernate.HibernateException: No Session found for current thread 

,当我用我自己的

sessionFactory.getCurrentSession().getTransaction().commit(); 
sessionFactory.getCurrentSession().beginTransaction(); 

测试提交末

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 

失败,我怎样才能得到一个单元测试没有交易?

该测试是否成才这样的:

userDao.clear(); 
    loadeduser = userService.getUserById(createUser.getUserID()); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(adminRole)); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(userRole)); 

    // Wait for auto unsign 
    TestUtils.sleep(10000); 

    userDao.clear(); 
    loadeduser = userService.getUserById(createUser.getUserID()); 
    assertFalse(loadeduser.getAuthoritiesEntities().contains(adminRole)); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(userRole)); 

它检查是否过期角色的自动unsign工作,石英作业每5秒

+0

你可以添加crontTest()的更多内容吗?我希望看到正在测试的主题的方法调用以及sessionFactory方法的位置。 – Jay

回答

1

通常我会建议使用单元测试代码可以在单个事务中进行测试,并进行集成测试(启动完整系统并执行您想要测试的序列)来测试多事务行为。

但是要回答这个问题:解决方法之一是从测试方法中删除@Transaction,但不是直接进行测试方法控制事务,而是让您测试的方法开始/提交他们自己的交易(他们通常会做什么,对吧?)

例如,我们可能有通过正常DAO工作流程运行的测试,并且每个DAO方法都标记为@Transactional。每种方法都控制着自己的事务提交,因此我们可以在单个测试方法中测试多事务行为。该测试可能是这样的:

// no @Transactional here, dao methods are @Transactional 
public void testMultiTransactionUpdate() { 
    Entity t = dao.getEntity(id); 
    t.setProperty("somethingnew"); 
    dao.update(t); 
    Entity t2 = dao.getEntity(id); 
    Assert.assertEquals(t1.getProperty(), t2.getProperty()); 
} 

有一点要小心的是,如果你是犯有危害的内存数据库(例如HSQLDB),在一次测试中进行了变更,将不会自动回滚和通常在随后的测试中可见。在测试结束时,您必须手动撤消所有更改,或确保您的测试数据不会干扰其他不那么容易的测试。这就是为什么我会谨慎使用这种技术。

+0

您好我需要这样的测试,因为我想确保石英配置正确。我打电话的服务是事务性的,但没有在测试中的交易,我得到“org.hibernate.HibernateException:没有发现当前线程的会话” – wutzebaer

+0

你可以添加测试代码到你的问题?测试中的某些内容正在调用需要打开会话的代码,我看不到那是什么。通常,仔细将@Transactional放置在服务方法上就足够了。 – Jay

+0

或者,您可以在您的测试中保留Transactional并将DefaultRollback = false添加到您的TransactionConfiguration中,然后在After annotaed方法中测试您想要测试的内容。在这种情况下,你可能希望这是班上唯一的考试。 – Jay