same for arquillian embedded adapter, tomee one is a real server adapter so no hokk like it ;)
@Asynchronous uses its own thread so yes that's pby the issue *Romain Manni-Bucau* *Twitter: @rmannibucau <https://twitter.com/rmannibucau>* *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* *Github: https://github.com/rmannibucau* 2013/4/10 John D. Ament <[email protected]> > Reinis, > > If you use Arquillian + TomEE your tests will work much better (e.g. no > thread issues). YOu can run TomEE embedded so it's not too much slower > either. DeltaSpike is only a CDI library so it shouldn't impact your > testing (so you're loading the libs up in to your WEB-INF/lib?) > > John > > > On Wed, Apr 10, 2013 at 3:45 PM, Reinis Vicups <[email protected]> wrote: > > > Thanks Mr. Ament for your input! > > > > Yes I think I will go with Arquillian, although Mr. Struberg is > persisting > > (no pun) me to go with DeltaSpike. > > > > The Prod. Env. is ofcourse TomEE+ > > > > I think that fully built application will even run in prod. env. but I > > really want to test my app before deploying. One good reason in this > > particular scenario is the "swallowed" exception especially if it could > be > > caused not because it's test setup but because am using @Asynchronous > e.g. > > > > Thank you guys for the instant feedback, now I have to do some serious > > Arquillian-re-factoring in my app o/ > > Reinis > > > > > > On 04/10/2013 09:32 PM, John D. Ament wrote: > > > >> I would hope those interested in Application Composer also look at > >> Arquillian for their automated testing needs (BTW: is your production > >> target ENV just OpenEJB + OWB?) > >> > >> I think part of your issue is your use of @asynchronous. > >> > >> > >> On Wed, Apr 10, 2013 at 3:28 PM, Reinis Vicups <[email protected]> > wrote: > >> > >> I guess, why is HeavyProcessingControllerProdu******cer session > >>> scoped? > >>> > >>> There > >>>> > >>>> is no HTTP Session when this unit test runs, so no it won't be active > at > >>>> that time. > >>>> > >>>> Ok but why then the same session scoped bean is able to read from JPA > >>> with > >>> no issues two method calls before? > >>> > >>> As you may notice in stacktrace there's xyz.my.domain.User > >>> (xyz.my.domain.User_$_****javassist_3.pcGetStateManager) This is the > >>> > >>> currently logged in user entity read from DB by JPA and passed up and > >>> down > >>> the stacktrace (injected or as param) in next to every method call. > >>> > >>> Reason why the HeavyProcessingControllerProdu****cer is session scoped > >>> is > >>> > >>> that it produces stuff for currently logged in session user whether > @New > >>> or > >>> existing. > >>> > >>> I understand your argument that theres no HTTP Session and it is > obvious, > >>> I just thought (am still hoping) that the ApplicationComposer does some > >>> hard-core bootstrapping magic and weaves, javaasists or whatever dark > >>> arts > >>> are there required to allow me to junit-test all sorts of CDI/JSF/EJB > >>> beans, no? :DDDD > >>> > >>> br > >>> Reinis > >>> > >>> > >>> > >>> On 04/10/2013 09:14 PM, John D. Ament wrote: > >>> > >>> What you're seeing is correct (though I'm not a good one to ask why > it's > >>>> only at the trace level that you see this exception). > >>>> > >>>> I guess, why is HeavyProcessingControllerProdu******cer session > scoped? > >>>> > >>>> There > >>>> > >>>> is no HTTP Session when this unit test runs, so no it won't be active > at > >>>> that time. > >>>> > >>>> > >>>> On Wed, Apr 10, 2013 at 3:00 PM, Reinis Vicups <[email protected]> > >>>> wrote: > >>>> > >>>> Hi guys, > >>>> > >>>>> got following scenario > >>>>> > >>>>> **>>>>>>>>>>>>>>>>>>>>>>>>>>>>****>>** > >>>>> > >>>>>> @org.junit.runner.RunWith(org.**** > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> **apache.openejb.junit.** > >>>>> > >>>>> ApplicationComposer) > >>>>> public class IamIntegrationTest{ > >>>>> > >>>>> // ACHTUNG! > >>>>> @javax.enterprise.inject.******Produces @javax.enterprise.inject.New > >>>>> HeavyProcessingController heavyProcessingController; > >>>>> > >>>>> @org.apache.openejb.testing.******Module > >>>>> public PersistenceUnit somePersistenceConfigHere() { > >>>>> // boring code > >>>>> } > >>>>> > >>>>> @org.apache.openejb.testing.******Configuration > >>>>> > >>>>> > >>>>> public Properties settingUpSomeRessourceConfig() { > >>>>> // boring code > >>>>> } > >>>>> > >>>>> @Test > >>>>> public void iAmHeavyIntegrationTestMethod(******) { > >>>>> heavyProcessingController.******readALittleBitFromJPA(); > >>>>> heavyProcessingController.******initiateSomeHeavyProcessing(); > >>>>> } > >>>>> } // end test class > >>>>> > >>>>> > >>>>> @javax.enterprise.context.******SessionScoped > >>>>> public class HeavyProcessingControllerProdu******cer { > >>>>> > >>>>> @Inject > >>>>> JPAService jpaService; > >>>>> > >>>>> @Produces @RequestScoped > >>>>> public List<SomeEntity> readALittleBitFromJPA() { > >>>>> jpaService.getEntityList(); > >>>>> } > >>>>> > >>>>> @javax.enterprise.inject.******Produces > >>>>> @javax.enterprise.inject.New > >>>>> public HeavyProcessingControllerprodu**** > >>>>> **ceHeavyProcessingController(****) { > >>>>> > >>>>> > >>>>> // ACHTUNG, invoking here JPA and it works! > >>>>> readALittleBitFromJPA(); > >>>>> > >>>>> // ACHTUNG, doing this because of some complex > initialization > >>>>> logic required aforehand. > >>>>> return org.apache.myfaces.extensions.******cdi.core.impl.util.** > >>>>> CodiUtils.** > >>>>> getContextualReferenceByClass(******HeavyProcessingController.** > >>>>> ****class); > >>>>> > >>>>> > >>>>> } > >>>>> } // end Producer class > >>>>> > >>>>> > >>>>> // ACHTUNG, this is stateful EJB Bean with no other explicit context > >>>>> annotations! > >>>>> @javax.ejb.Stateful > >>>>> public class HeavyProcessingController implements Serializable { > >>>>> > >>>>> @Inject > >>>>> AsyncHeavyProcessingWorker asyncWorker; > >>>>> > >>>>> public void initiateSomeHeavyProcessing() { > >>>>> // ACHTUNG! @Asynchronous method is invoked here > >>>>> asyncWorker.******asyncDoHeavyProcessingAndSaveY****** > >>>>> > >>>>> ourWorkIntoPersistence(); > >>>>> > >>>>> } > >>>>> } > >>>>> > >>>>> > >>>>> // ACHTUNG, this is stateful EJB Bean with no other explicit context > >>>>> annotations! > >>>>> @javax.ejb.Stateful > >>>>> public class AsyncHeavyProcessingWorkerimpl******ements Serializable > { > >>>>> > >>>>> @Inject > >>>>> JPAService jpaService; > >>>>> > >>>>> @Asynchronous > >>>>> > >>>>> public void asyncDoHeavyProcessingAndSaveY**** > >>>>> **ourWorkIntoPersistence(){ > >>>>> // ACHTUNG! > >>>>> jpaService.persist(******allThatHardWork); > >>>>> > >>>>> } > >>>>> } > >>>>> > >>>>> @javax.ejb.Stateless > >>>>> public class JPAService { > >>>>> > >>>>> @PersistenceContext > >>>>> EntityManager em; > >>>>> > >>>>> // ACHTUNG, no explicit TransacactionAttribute, using defaults! > >>>>> public void persist(SomeJPAEntity allThatHardWork) { > >>>>> em.persist(allThatHardWork); > >>>>> } <- ACHTUNG, exceptionsomewhere here! > >>>>> } > >>>>> > >>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<******<<<<<<<<<<<<<<<<<<<<<<<<<<** > >>>>> <<**<<** > >>>>> > >>>>> > >>>>> <<<<<<<<<<<<<<<<<<<<<<<< > >>>>> > >>>>> Executing this code causes following exception: > >>>>> > >>>>> > >>>>> 3389 default TRACE [@Asynchronous IntegrationTest - 1] > >>>>> openjpa.Runtime > >>>>> - > org.apache.openjpa.******persistence.******EntityManagerFactoryImpl@ > >>>>> **** > >>>>> 51d62781 > >>>>> created EntityManager org.apache.openjpa.**** > >>>>> persistence.EntityManagerImpl@***** > >>>>> *5ead44a4. > >>>>> 123394 default TRACE [@Asynchronous IntegrationTest - 1] > >>>>> openjpa.Runtime - An exception occurred while ending the transaction. > >>>>> This > >>>>> exception will be re-thrown. > >>>>> javax.enterprise.context.******ContextNotActiveException: WebBeans > >>>>> context > >>>>> > >>>>> > >>>>> with scope type annotation @SessionScoped does not exist within > current > >>>>> thread > >>>>> at org.apache.webbeans.container.******BeanManagerImpl.** > >>>>> getContext(*** > >>>>> * > >>>>> BeanManagerImpl.java:351) > >>>>> at org.apache.webbeans.intercept.******** > >>>>> NormalScopedBeanInterceptorHan****** > >>>>> dler.getContextualInstance(********NormalScopedBeanInterceptorHan** > >>>>> **** > >>>>> dler.java:143) > >>>>> at org.apache.webbeans.intercept.******** > >>>>> NormalScopedBeanInterceptorHan****** > >>>>> dler.invoke(******NormalScopedBeanInterceptorHan******dler.java:114) > >>>>> at org.apache.webbeans.intercept.******** > >>>>> NormalScopedBeanInterceptorHan****** > >>>>> dler.invoke(******NormalScopedBeanInterceptorHan******dler.java:108) > >>>>> *_at xyz.my.domain.User_$$_******javassist_3.pcGetStateManager(****** > >>>>> User_$$_javassist_3.java)_* > >>>>> at org.apache.openjpa.kernel.******BrokerImpl.isDetached(** > >>>>> BrokerImpl.java:4580) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> SingleFieldManager.preFlushPC(****** > >>>>> SingleFieldManager.java:775) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> SingleFieldManager.preFlush(** > >>>>> SingleFieldManager.java:621) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> SingleFieldManager.preFlush(** > >>>>> SingleFieldManager.java:589) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> SingleFieldManager.preFlush(** > >>>>> SingleFieldManager.java:505) > >>>>> at org.apache.openjpa.kernel.******StateManagerImpl.preFlush(** > >>>>> StateManagerImpl.java:2982) > >>>>> at org.apache.openjpa.kernel.******PNewState.beforeFlush(** > >>>>> PNewState.java:40) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> StateManagerImpl.beforeFlush(****** > >>>>> StateManagerImpl.java:1054) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> BrokerImpl.flush(BrokerImpl.** > >>>>> java:2112) > >>>>> at org.apache.openjpa.kernel.******BrokerImpl.flushSafe(** > >>>>> BrokerImpl.java:2072) > >>>>> at org.apache.openjpa.kernel.****** > >>>>> BrokerImpl.beforeCompletion(** > >>>>> BrokerImpl.java:1990) > >>>>> at org.apache.geronimo.******transaction.manager.**** > >>>>> TransactionImpl.** > >>>>> beforeCompletion(******TransactionImpl.java:527) > >>>>> at org.apache.geronimo.******transaction.manager.**** > >>>>> TransactionImpl.** > >>>>> beforeCompletion(******TransactionImpl.java:512) > >>>>> at org.apache.geronimo.******transaction.manager.** > >>>>> TransactionImpl.beforePrepare(******TransactionImpl.java:413) > >>>>> at org.apache.geronimo.******transaction.manager.**** > >>>>> TransactionImpl.commit( > >>>>> **TransactionImpl.java:262) > >>>>> at org.apache.geronimo.******transaction.manager.** > >>>>> TransactionManagerImpl.commit(******TransactionManagerImpl.** > >>>>> java:****252) > >>>>> at org.apache.openejb.core.******transaction.**** > >>>>> JtaTransactionPolicy.** > >>>>> completeTransaction(******JtaTransactionPolicy.java:328) > >>>>> at > org.apache.openejb.core.******transaction.TxRequired.commit(* > >>>>> ***** > >>>>> TxRequired.java:75) > >>>>> at org.apache.openejb.core.******transaction.**** > >>>>> EjbTransactionUtil.** > >>>>> afterInvoke(******EjbTransactionUtil.java:76) > >>>>> at org.apache.openejb.core.******stateful.StatefulContainer.** > >>>>> afterInvoke(StatefulContainer.******java:843) > >>>>> at org.apache.openejb.core.******stateful.StatefulContainer.** > >>>>> businessMethod(******StatefulContainer.java:667) > >>>>> at org.apache.openejb.core.******stateful.StatefulContainer.** > >>>>> invoke(StatefulContainer.java:******364) > >>>>> at org.apache.openejb.core.ivm.******EjbObjectProxyHandler.** > >>>>> > synchronizedBusinessMethod(******EjbObjectProxyHandler.java:******256) > >>>>> at org.apache.openejb.core.ivm.******EjbObjectProxyHandler$1.** > >>>>> call(*** > >>>>> * > >>>>> EjbObjectProxyHandler.java:******244) > >>>>> at org.apache.openejb.async.******AsynchronousPool$** > >>>>> AsynchronousCall.call(******AsynchronousPool.java:110) > >>>>> at java.util.concurrent.******FutureTask$Sync.innerRun(** > >>>>> FutureTask.java:334) > >>>>> at java.util.concurrent.******FutureTask.run(FutureTask.****** > >>>>> java:166) > >>>>> at java.util.concurrent.******ThreadPoolExecutor.runWorker(*** > >>>>> *** > >>>>> ThreadPoolExecutor.java:1110) > >>>>> at java.util.concurrent.******ThreadPoolExecutor$Worker.run(** > >>>>> **** > >>>>> ThreadPoolExecutor.java:603) > >>>>> at java.lang.Thread.run(Thread.******java:722) > >>>>> > >>>>> > >>>>> WARNING - Could NOT lazily initialize session context because NO > active > >>>>> request context > >>>>> 123395 default TRACE [@Asynchronous IntegrationTest - 1] > >>>>> openjpa.Runtime - org.apache.openjpa.****** > >>>>> persistence.EntityManagerImpl@*** > >>>>> > >>>>> ***5ead44a4.close() > >>>>> > >>>>> invoked. > >>>>> > >>>>> I have following questions: > >>>>> > >>>>> 1.Why is that this exception is logged ONLY when setting openjpa.log > to > >>>>> Runtime=TRACE? In other cases it's "swallowed" (as in there's no > >>>>> exception > >>>>> thrown in jpaService.persist(******allThatHardWork);) > >>>>> > >>>>> > >>>>> > >>>>> 2. Why is this exception? I already access JPA from @SessionScoped > bean > >>>>> in > >>>>> HeavyProcessingControllerProdu******cer.****** > >>>>> produceHeavyProcessingControll > >>>>> ****er() > >>>>> > >>>>> > >>>>> when I readALittleBitFromJPA() and it reads from Database just fine. > >>>>> > >>>>> 3. If you care to comment on the design of those classes, I would > love > >>>>> to > >>>>> here if it's ok or not > >>>>> > >>>>> Thanks guys for reading this lengthy e-mail and even more thanks if > you > >>>>> give your thought on this > >>>>> Reinis. > >>>>> > >>>>> > >>>>> >
