java - 使用 Spring @Transactional 进行 TestNG 多线程测试

标签 java multithreading unit-testing spring testng

我正在使用 TestNG 测试持久性 Spring 模块 (JPA+Hibernate),使用 AbstractTransactionalTestNGSpringContextTests 作为基类。所有重要部分@Autowired、@TransactionConfiguration、@Transactional 都可以正常工作。

当我尝试使用 threadPoolSize=x, invocationCount=y TestNG 注释在并行线程中运行测试时出现问题。

WARNING: Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@174202a] 
to process 'before' execution of test method [testCreate()] for test instance [DaoTest] java.lang.IllegalStateException:
Cannot start new transaction without ending existing transaction: Invoke endTransaction() before startNewTransaction().
at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:123)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:374)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextBeforeTestMethod(AbstractTestNGSpringContextTests.java:146)

... 有人遇到过这个问题吗?

代码如下:

@TransactionConfiguration(defaultRollback = false)
@ContextConfiguration(locations = { "/META-INF/app.xml" })
public class DaoTest extends AbstractTransactionalTestNGSpringContextTests {

@Autowired
private DaoMgr dm;

@Test(threadPoolSize=5, invocationCount=10)
public void testCreate() {
    ...
    dao.persist(o);
    ...
}
...

更新: AbstractTransactionalTestNGSpringContextTests 似乎只为主线程维护事务,而所有其他测试线程都没有获得自己的事务实例。解决这个问题的唯一方法是扩展 AbstractTestNGSpringContextTests 并以编程方式维护事务(而不是 @Transactional 注释)每个方法(即使用 TransactionTemplate):

@Test(threadPoolSize=5, invocationCount=10)
public void testMethod() {
    new TransactionTemplate(txManager).execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            // transactional test logic goes here
        }
    }
}

最佳答案

事务需要在同一个线程中启动,这里有更多细节:

Spring3/Hibernate3/TestNG: some tests give LazyInitializationException, some don't

关于java - 使用 Spring @Transactional 进行 TestNG 多线程测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202045/

相关文章:

java - 为 jQuery 选择哪个 Java Web 框架?

java - Java中读取结构化文件

java - 如何修复 "No ModelAndView found"失败的测试?

单元测试 spring 服务类中的 java.lang.NullPointerException

java - 手动管理持久性上下文的技巧

java - Java从文本文件中读取数据

Java:为什么线程不会终止

c# - 在 TFS 构建服务器上运行单元测试 Fakes Framework |错误

Java/野蝇: Threads piling up/Eclipse shows one additional running thread for each request

c# - 屏障类c#