如何在TestNG @BeforeClass中使用事务?

时间:2017-03-20 11:20:04

标签: spring hibernate testng spring-transactions

我使用TestNG + Spring + hibernate。 当我在@BeforeClass中使用事务时,我得到:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

代码示例:

@Transactional(transactionManager = "transactionManager")
@Rollback
@ContextConfiguration(locations = "/WEB-INF/testing/applicationTestContext.xml")
@TestExecutionListeners(listeners = {
        ServletTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        SqlScriptsTestExecutionListener.class,
        WithSecurityContextTestExecutionListener.class
})
public abstract class ExampleOfTest extends AbstractTestNGSpringContextTests{
    @Autowired
    private SessionFactory sessionFactory;

    @BeforeClass
    public void setUpClass() {
        sessionFactory.getCurrentSession().beginTransaction(); // get HibernateException
        sessionFactory.getCurrentSession().getTransaction().commit();
    }

    ....

}

如何在@BeforeClass中使用交易? 我想将它用于所有类测试中使用的一次性数据输入。

1 个答案:

答案 0 :(得分:1)

问题是@EnableTransactionManagement应该在你的春天背景中

尝试类似

的内容
// BMT idiom with getCurrentSession()
try {
    UserTransaction tx = (UserTransaction)new InitialContext()
                            .lookup("java:comp/UserTransaction");

    tx.begin();

    // Do some work on Session bound to transaction
    sessionFactory.getCurrentSession().persist(...);

    tx.commit();
}
catch (RuntimeException e) {
    tx.rollback();
    throw e; // or display error message
}

getCurrentSession类似于受限制,它应该在活动事务中运行。

我认为这可能会有所帮助。