当前位置: 首页 > 面试题库 >

使用Spring @Transactional的TestNG多线程测试

谢胤
2023-03-14
问题内容

我正在使用TestNG使用AbstractTransactionalTestNGSpringContextTests作为基类来测试持久性Spring模块(JPA
+ Hibernate)。@ 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仅维护主线程的事务。解决该问题的唯一方法是扩展每种方法(即使用TransactionTemplate)的AbstractTestNGSpringContextTests并以编程方式维护事务(而不是@Transactional批注):

@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:有些测试给出LazyInitializationException,有些没有



 类似资料:
  • 我正在学习使用TestNG进行单元测试。我想将变量“val”的唯一值传递给线程池中的每个线程,但它没有接收它。 这里是testng类: 和输出: [ThreadUtil]启动执行器超时:1000msworkers:5ThreadPoolSize:5BeForeMethod。线程id为:15 BeforeMethod。线程id为:12 BeforeMethod。线程id为:14 BeforeMeth

  • 应用程序堆栈:Spring boot 2.1V+测试容器PostgreSQL 1.10.3V+JUnit 4.12V DB testcontainers配置 基本集成测试类 在任何事情发生的地方调用服务的集成测试 逻辑简化的服务

  • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native

  • 我试图创建一起使用JBehave和TestNG的概念验证。我想做的是在多个线程中同时运行一个故事,以测试我的代码的线程安全性。 我有一个简单的类,它只做一件事,在给定的整数值上计算模7。我已经为这个类创建了一个简单的BDD测试。我已经按照JBehave“入门”文档中的描述设置了BDD测试。唯一的区别是,在我的JUnitStory文件中,我没有使用JUnit的@Test注释,而是使用了TestNG的

  • 我正在用Hibernate为我们的Spring Boot REST API创建单元测试。我只是想知道当我使用@transactional时是否有问题。如果我用@Transactional注释测试,数据将永远不会真正进入数据库,并且会绕过潜在的错误源,我是否认为这是正确的?因为某些错误只发生在提交期间?还是我看错了? 在@test之后回滚事务-以下问题与我的问题不完全一致。因为我想知道如何触发提交并

  • 我有一个java maven项目,我希望使用多线程进行测试。我在src/test中有testng.xml,maven surefire插件被配置为使用它。就像这个页面一样:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 编辑:增加了一定的pom条目