Spring3/hibernate3/testng: بعض الاختبارات تعطي lazyinitializationexception ، والبعض الآخر لا

StackOverflow https://stackoverflow.com/questions/1571017

سؤال

المقدمة: أنا أواجه تكافح مع LazyInitializationException في اختبارات وحدتي ، ولدي صعوبة في الحصول على رأسي حولها ، كما ترون من أسئلتيجلسات قاعدة البيانات في الربيع, Testng و Spring 3 و LazyInitializationException أثناء فئات كيان السبات في اختبار الوحدة للاستخدام في الربيع ، باستخدام TestNg

من أجل أن أتمكن من طرح سؤالي بوضوح ، قمت بعمل عينة على Github: http://github.com/niklassaers/sample-spring3-app/ في هذا المشروع العينة ، أقوم بإعادة إنتاج المشكلات التي أواجهها في مشاريع Spring3/Hibernate3/TestNG.

السؤال: لديّ اختباران للوحدة ، وهما متشابهان تمامًا ، واختبر نفس الفئة لنفس المجموعة من العناصر التي تستخدم نفس الخدمة. واحد يدير ، واحد فشل. لماذا فشل الفشل؟ (أو ، لماذا لا يفشل الجري بنفس الطريقة؟)

هذا هو الاختبار الفاشل:

@Test(timeOut=1000)
public void Roles() {
    User mockUser = userService.read(1);
    Assert.assertNotNull(mockUser);
    Assert.assertTrue(mockUser.isValid());
    Set<Role> roles = mockUser.getRoles();
    int size = roles.size();  // This line gives a LazyInitializationException
    Assert.assertTrue(size > 0);
}

الرمز الكامل على (( http://github.com/niklassaers/sample-spring3-app/blob/master/src/tld/mydomain/sample/entities/test/failinguserunittest.java )

وهنا اختبار الجري:

@Test
public void Roles() {
    for(int i = 1; i <= 4; i++) {
        User user = userService.read(i);
        Assert.assertNotNull(user);
        Assert.assertTrue(user.isValid());
        Set<Role> roles = user.getRoles();
        Assert.assertTrue(roles.size() > 0); // This line does not give a LazyInitializationException
        for(Role r : roles) {
            Assert.assertNotNull(r.getName());
            for(User someUser : r.getUsers())
                Assert.assertNotNull(someUser.getName());
        }
    }
}

الرمز الكامل على (( http://github.com/niklassaers/sample-spring3-app/blob/master/src/tld/mydomain/sample/entities/test/userunittest.java )

يتبع أدناه إخراج وحدة التحكم من إجراء اختباراتي. أفهم أن لدي الخدمات ملفوفة في TransactionProxyfactorybean (انظر http://github.com/niklassaers/sample-spring3-app/blob/master/webroot/web-inf/app-model.xml) ، وهذا يجعلهم يعملون في معاملة ، ولا يتم لف اختبارات الوحدة ، مما يجعل الاختبار مثل العرض. وجهات النظر التي "إصلاحها" مع OpenSessionInViewceptor. لكنني تعلمت أن كل اختبار للوحدة مشروح بـ test في فصل يمتد من agrusstransactionaltestngspringConteStts يجب أن يتم أيضًا لفه في معاملته الخاصة ، وقد قمت بالفعل بتوضيح كلا الفئتين لتراجع المعاملة بعد انتهاء كل اختبار. لهذا السبب أنا في حيرة مضاعفة لسبب فشل اختبار واحد ولا أحد. أي أدلة أو حلول؟

لا تتردد في تعديل مشروع العينة في Github كما ترى مناسبة ، يجب أن تكون كل الكود موجودة ، لكنني تركت ملفات الجرة من أجل البساطة. هذا هو الإخراج الكامل كما وعدت:

[Parser] Running:
  /Users/niklas/Documents/Eclipse/SampleProject/testng.xml

2009-10-15 10:16:16,066 [TestNGInvoker-Roles()] ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: tld.mydomain.sample.entities.User.roles, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: tld.mydomain.sample.entities.User.roles, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
    at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:119)
    at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)
    at tld.mydomain.sample.entities.test.FailingUserUnitTest.Roles(FailingUserUnitTest.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:607)
    at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:49)
    at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:40)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:637)

===============================================
SampleAppSuite
Total tests run: 3, Failures: 1, Skips: 0
===============================================

هتافات

نيك

هل كانت مفيدة؟

المحلول

قم بإزالة المهلة = 1000 من التعليق التوضيحي test. يبدو أن هذا يتسبب في إجراء الاختبار في موضوع منفصل (كما هو واضح من قبل StackTrace ، حيث يتم إلقاء الاستثناء من ThreadPool). ترتبط المعاملات و SessionFactory بالخيط الرئيسي ، وليس إلى مؤشر ترابط عداء الاختبار ، مما يسبب هذا الاستثناء.

لقد قمت بتشغيل رمز المثال الخاص بك وحصلت على الاختبار للعمل. في المستقبل ، سيكون من المفيد إذا قمت بتضمين maven2 pom.xml مع تبعياتك بحيث يكون من الأسهل بالنسبة لأولئك الذين يحاولون تجميع الكود الخاص بك للقيام بذلك بالفعل.

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