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 >>> >>>>>> >>> >>>>>> >>> >>>> >>> >>>> >>> >>> >>> > >>> >>> >> >
