Thanks Gerhard, this is really helpful ! The problem with JerseyTest is most of the classes are final, I will see with Jersey team if they can do something for CDI. I updated the demo project.
However, it is still not working as expected. When I try to instrument twice in the same test class (same applicationMockManager), the second test fails because the mock isn’t properly instrumented. If I run only one test in the class, they pass. I was wondering if it was because ApplicationMockManager isn’t thread safe (stores mock in a Map) ? Thanks JC On Feb 4, 2015, at 11:38 AM, Gerhard Petracek <[email protected]> wrote: > fyi: > we added some hints at [1]. > that way it works, however, everybody is very welcome to improve it. > (a proper integration of jersey-test and cdi would be better for sure...) > > regards, > gerhard > > [1] > http://deltaspike.apache.org/documentation/test-control.html#_using_jersey_test_with_test_control > > > > http://www.irian.at > > Your JavaEE powerhouse - > JavaEE Consulting, Development and > Courses in English and German > > Professional Support for Apache > MyFaces, DeltaSpike and OpenWebBeans > > > > 2015-02-04 12:26 GMT+01:00 Gerhard Petracek <[email protected]>: > >> short addition: >> >> if you can't (or don't like to) register a custom ServletRequestListener, >> you can create a custom TestContainerFactory (for jersey) to create a >> custom TestContainer for wrapping the default handler - e.g. via: >> >> HandlerWrapper cdiHandlerWrapper = new CdiHandlerWrapper(); >> cdiHandlerWrapper.setHandler(this.server.getHandler()); >> this.server.setHandler(cdiHandlerWrapper); >> >> (after creating the server-instance via JettyHttpContainerFactory) >> >> >> CdiHandlerWrapper can look like: >> >> public class CdiHandlerWrapper extends HandlerWrapper >> { >> @Override >> public void handle(String target, Request baseRequest, >> HttpServletRequest request, HttpServletResponse response) throws >> IOException, ServletException >> { >> CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer(); >> >> try >> { >> >> cdiContainer.getContextControl().startContext(RequestScoped.class); >> super.handle(target, baseRequest, request, response); >> } >> finally >> { >> >> cdiContainer.getContextControl().stopContext(RequestScoped.class); >> } >> } >> } >> >> with that all your tests work. >> >> regards, >> gerhard >> >> http://www.irian.at >> >> Your JavaEE powerhouse - >> JavaEE Consulting, Development and >> Courses in English and German >> >> Professional Support for Apache >> MyFaces, DeltaSpike and OpenWebBeans >> >> >> >> 2015-02-04 10:03 GMT+01:00 Gerhard Petracek <[email protected]>: >> >>> hi jc, >>> >>> no - that wasn't the point. >>> >>> #1 CdiTestRunner does the injection, scope-handling,... in the test and >>> therefore in the test-thread -> you can't remove it >>> #2 CdiTestRunner can't start scopes in any >other thread< (in your case >>> jetty has to trigger weld to do it) >>> #3 SimpleMockManager needs to be @RequestScoped, but jetty/weld needs to >>> do the scope-handling for the 2nd thread (like in a normal app) >>> >>> if you change e.g. PingResource to @RequestScoped even >>> PingResourceSimpleTest fails for the same reason. >>> >>> -> CdiTestRunner is fine, SimpleMockManager is fine and the call to #getMock >>> is fine as well. >>> however, in your setup jetty isn't integrated properly (with weld). >>> see any setup of jetty and weld or a manual integration (e.g. used at >>> [1]). >>> >>> regards, >>> gerhard >>> >>> [1] http://s.apache.org/Qja >>> >>> http://www.irian.at >>> >>> Your JavaEE powerhouse - >>> JavaEE Consulting, Development and >>> Courses in English and German >>> >>> Professional Support for Apache >>> MyFaces, DeltaSpike and OpenWebBeans >>> >>> >>> >>> 2015-02-04 4:13 GMT+01:00 Jean-Christophe Counio < >>> [email protected]>: >>> >>>> >>>> So after further testing, it looks like the issue is the >>>> SimpleMockManager is @RequestScoped. The instance is shared properly by the >>>> container between the test and jersey but the call to getMock is proxied >>>> and fails since the context isn’t active. Would it fix the problem if the >>>> MockManager scope was Application in this case ? >>>> >>>> JC >>>> >>>> On Feb 3, 2015, at 4:00 PM, Jean-Christophe Counio < >>>> [email protected]> wrote: >>>> >>>>> Thanks, yes that makes sense. If I comment the @RunWith (going to pure >>>> JerseyTest), the dependency injection doesn’t happen at all, so I was >>>> thinking Jersey recognize the test container in some way, but I can see now >>>> there are 2 different BeanManangers in application and tests. >>>>> Any idea how to solve that issue ? Doing the same thing in Spring is 2 >>>> lines of code so I hope there’s way to do the same with CDI. >>>>> >>>>> JC >>>>> >>>>> >>>>> On Feb 3, 2015, at 3:13 PM, Gerhard Petracek < >>>> [email protected]> wrote: >>>>> >>>>>> hi jc, >>>>>> >>>>>> it doesn't work because jetty uses an own thread to answer the >>>> request and >>>>>> therefore the cdi-container needs to be integrated properly >>>>>> (the request-context needs to be active for every request answered by >>>>>> jetty). >>>>>> >>>>>> just fyi: >>>>>> CdiTestRunner just manages the current (test-)thread. >>>>>> >>>>>> regards, >>>>>> gerhard >>>>>> >>>>>> http://www.irian.at >>>>>> >>>>>> Your JavaEE powerhouse - >>>>>> JavaEE Consulting, Development and >>>>>> Courses in English and German >>>>>> >>>>>> Professional Support for Apache >>>>>> MyFaces, DeltaSpike and OpenWebBeans >>>>>> >>>>>> >>>>>> >>>>>> 2015-02-03 19:54 GMT+01:00 Gerhard Petracek < >>>> [email protected]>: >>>>>> >>>>>>> hi jc, >>>>>>> >>>>>>> ok - i'll have a look at it soon. >>>>>>> >>>>>>> regards, >>>>>>> gerhard >>>>>>> >>>>>>> http://www.irian.at >>>>>>> >>>>>>> Your JavaEE powerhouse - >>>>>>> JavaEE Consulting, Development and >>>>>>> Courses in English and German >>>>>>> >>>>>>> Professional Support for Apache >>>>>>> MyFaces, DeltaSpike and OpenWebBeans >>>>>>> >>>>>>> >>>>>>> >>>>>>> 2015-02-03 19:27 GMT+01:00 Jean-Christophe Counio < >>>>>>> [email protected]>: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> Here’s the link : >>>>>>>> https://github.com/couniojc/jerseytest-cdi >>>>>>>> >>>>>>>> If you set >>>>>>>> "deltaspike.testcontrol.mock-support.allow_mocked_beans=false”, you >>>> can run >>>>>>>> PingResourceSimpleTest (no mocks in this one) >>>>>>>> As soon as you set it to true, it throws the exception. >>>>>>>> >>>>>>>> Thanks >>>>>>>> >>>>>>>> JC >>>>>>>> >>>>>>>> >>>>>>>> On Feb 3, 2015, at 12:29 AM, Gerhard Petracek < >>>> [email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> hi jc, >>>>>>>>> >>>>>>>>> please provide a link to a demo which illustrates the issue. >>>>>>>>> >>>>>>>>> regards, >>>>>>>>> gerhard >>>>>>>>> >>>>>>>>> http://www.irian.at >>>>>>>>> >>>>>>>>> Your JavaEE powerhouse - >>>>>>>>> JavaEE Consulting, Development and >>>>>>>>> Courses in English and German >>>>>>>>> >>>>>>>>> Professional Support for Apache >>>>>>>>> MyFaces, DeltaSpike and OpenWebBeans >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> 2015-02-03 2:18 GMT+01:00 Jean-Christophe Counio < >>>>>>>>> [email protected]>: >>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> Anyone successfully integrated JerseyTest with mocks using >>>> deltaspike ? >>>>>>>>>> When I activate >>>>>>>>>> deltaspike.testcontrol.mock-support.allow_mocked_beans=true, I >>>> have the >>>>>>>>>> following error : >>>>>>>>>> >>>>>>>>>> org.jboss.weld.context.ContextNotActiveException: WELD-001303: No >>>>>>>> active >>>>>>>>>> contexts for scope type javax.enterprise.context.RequestScoped >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:687) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.proxies.DynamicMockManager$1777947725$Proxy$_$$_WeldClientProxy.getMock(Unknown >>>>>>>>>> Source) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.apache.deltaspike.testcontrol.impl.mock.MockAwareInjectionTargetWrapper.produce(MockAwareInjectionTargetWrapper.java:59) >>>>>>>>>> at >>>> org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149) >>>>>>>>>> at >>>>>>>>>> >>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98) >>>>>>>>>> at >>>>>>>>>> >>>>>>>> >>>> org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78) >>>>>>>>>> at >>>>>>>>>> >>>> com.test.simplerest.PingResource$Proxy$_$$_WeldClientProxy.ping(Unknown >>>>>>>>>> Source) >>>>>>>>>> >>>>>>>>>> The test is like this : >>>>>>>>>> @RunWith(CdiTestRunner.class) >>>>>>>>>> public class PingResourceTest extends JerseyTest { >>>>>>>>>> >>>>>>>>>> @Inject >>>>>>>>>> ApplicationMockManager applicationMockManager; >>>>>>>>>> >>>>>>>>>> MyInj injMock = EasyMock.createMock(MockType.NICE, MyInj.class); >>>>>>>>>> >>>>>>>>>> @Override >>>>>>>>>> protected Application configure() { >>>>>>>>>> return new MyApp(); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> @Test >>>>>>>>>> public void testPing() { >>>>>>>>>> applicationMockManager.addMock(injMock); //no behavior set >>>> so it >>>>>>>>>> should return null >>>>>>>>>> String resp = target("/ping").request().get(String.class); >>>>>>>>>> Assert.assertEquals("Ping", “null", resp); >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> I tried to play with @TestControl but there’s no changes. >>>>>>>>>> >>>>>>>>>> Thanks >>>>>>>>>> >>>>>>>>>> JC >>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>> >>>> >>>> >>> >>
