سؤال

أنا أستخدم TESTNG لاختبار الوحدات النمذجة الربيعية للمثبتين (JPA + Learernate) باستخدام التزلجات Transtransacyaltestngspringcontests كصف أساسي. جميع الأجزاء المهمة @ Sautowired ،TransactionConfiguration، Transactional العمل على ما يرام.

المشكلة تأتي عندما أحاول تشغيل اختبار في مؤشرات الترابط الموازية مع ThreadPoolSize = x، إلحاق بتطلعn 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);
    ...
}
...

تحديث: يبدو أن التزلجات StressTransactionStngsPringContestStest يحافظ على المعاملة فقط للخيط الرئيسي عندما لا تحصل جميع مؤشرات ترابط الاختبار الأخرى على مثيل المعاملات الخاصة به. الطريقة الوحيدة لحل ذلك هو تمديد التزلجات Strustngspringcontextts والحفاظ على المعاملة برمجيا (بدلا من التوضيحية 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، بعض لا

نصائح أخرى

ألا تعتقد أن هذا يأتي بدلا من Org.SpringFramework.test.context.testcontextmanager غير آمن للخيط (انظر https://jira.springsource.org/browse/spr-5863.)?

واجهت نفس المشكلة عندما أردت تشغيل اختبارات اختبار المعاملات الخاصة بي بالتوازي ويمكنك أن ترى أن الربيع يحاول بالفعل ربط المعاملة إلى الخيط الأيمن.

ومع ذلك فشل هذا بشكل عشوائي مع هذا النوع من الأخطاء. امتدت أثرياءالتاليالستنجراسبرينتاج

@Override
@BeforeMethod(alwaysRun = true)
protected synchronized void springTestContextBeforeTestMethod(
        Method testMethod) throws Exception {
    super.springTestContextBeforeTestMethod(testMethod);
}

@Override
@AfterMethod(alwaysRun = true)
protected synchronized void springTestContextAfterTestMethod(
        Method testMethod) throws Exception {
    super.springTestContextAfterTestMethod(testMethod);
}

(المفتاح يجري المزامنة ...)

ويعمل الآن مثل سحر. لا أستطيع الانتظار لربيع 3.2 رغم ذلك حتى أنه يمكن أن تكون متوازية تماما!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top