So tomee remote, no embedded ;) But thats another talk ;) Le 10 avr. 2013 22:41, "John D. Ament" <[email protected]> a écrit :
> Sorry no, I was referring to TomEE embedded. Like I once wrote > > *Try to target your production runtime in your automated Arquillian > Unit/Integration tests as much as possible.* > * > * > :-) > > John > > > On Wed, Apr 10, 2013 at 4:29 PM, Romain Manni-Bucau > <[email protected]>wrote: > > > @John: yes, thanks to arquillian.xml...but i thought to openejb adapter > > speaking of embedded adapter > > > > *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]> > > > > > @Romain > > > > > > TomEE embedded doesn't use Servlet 3 protocol even in embedded mode? > > > That's overrideable, right? > > > > > > > > > On Wed, Apr 10, 2013 at 4:23 PM, Romain Manni-Bucau > > > <[email protected]>wrote: > > > > > > > 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. > > > > > >>>>> > > > > > >>>>> > > > > > >>>>> > > > > > > > > > > > > > > >
