hi jc, you are very welcome to create a jira-ticket and provide a patch there. the original ticket was closed, because we haven't seen a portable approach for that.
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-13 2:46 GMT+01:00 Jean-Christophe Counio < [email protected]>: > Hi, > > After putting initialization of beans in a static method, I was able to > run the tests in different tests cases and . As you mention in the > documentation, it seems there are optimizations/caching at CDI level that > prevents to modify mock behavior once it is injected. > Anyway I updated my test cases and examples in github. > > However we cannot use DeltaSpike with EasyMock if you are mocking an > interface, there was a ticket opened on it : > https://issues.apache.org/jira/browse/DELTASPIKE-707 > > I added a test to my repo to demonstrate this : > > https://github.com/couniojc/jerseytest-cdi/blob/master/src/test/java/com/test/simplerest/PingResourceInjectionInterfaceTest.java > > This is due to the fact that the ‘addMock’ is calling the superClass of > the mocked object, which in the case of mock frameworks (mockito, easymock) > is a proxy object, so the superclass is like java.lang.reflect.Proxy > I’m not sure why the ticket was closed since it can be solved easily > (e.g., just add an overloading addMock() entry with one more parameter that > is the interface - I’m happy to provide a patch for this -), even if > there’s a workaround using @Typed it is quite ugly, especially if you have > several mocks. > > Thanks > > JC > > On Feb 8, 2015, at 2:55 PM, Gerhard Petracek <[email protected]> > wrote: > > > hi jc, > > > > just by adding a web.xml file (in WEB-INF), mvn clean package works here > > (jdk 1.7.x) > > > > 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-06 21:55 GMT+01:00 Jean-Christophe Counio < > > [email protected]>: > > > >> Hi, > >> > >> I pushed the changes to the repo here : > >> https://github.com/couniojc/jerseytest-cdi > >> I aligned the naming with what you have in the doc, I think it is clear > >> enough for people to write their own > >> > >> When the tests are run, they run sequentially and still they fail. I put > >> everything in the same test, it is working. It may not be a > multithreading > >> issue but something’s happening with the mocks between tests. > >> > >> JC > >> > >> On Feb 4, 2015, at 3:05 PM, Gerhard Petracek < > [email protected]> > >> wrote: > >> > >>> hi jc, > >>> > >>> yes - jersey-test doesn't look that extensible... > >>> > >>> please compare your local changes with [1] and let us know if we can > >>> improve the hints in our documentation. > >>> (please don't use CdiAwareJettyTestContainer as it is. like in the > >>> documentation the important change is marked. > >>> -> you can copy the original implementation from jersey and add the > lines > >>> which are marked and also mentioned in the documentation.) > >>> > >>> since parallel test-execution can cause logical (test-)issues with > >>> different contexts (e.g. because we have to mock the http-session), > >>> it isn't supported anyway and therefore ApplicationMockManager doesn't > >> need > >>> to be thread-safe. > >>> i'll check if the documentation covers that already. > >>> > >>> regards, > >>> gerhard > >>> > >>> [1] http://s.apache.org/bE9 > >>> > >>> 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 23:28 GMT+01:00 Jean-Christophe Counio < > >>> [email protected]>: > >>> > >>>> 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 > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>> > >>>> > >> > >> > >
