我正在使用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条目