deltaspike-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gerhard Petracek <gerhard.petra...@gmail.com>
Subject Re: JerseyTest mock support
Date Wed, 04 Feb 2015 23:05:36 GMT
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 <
jean-christophe.counio@oracle.com>:

> 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 <gerhard.petracek@gmail.com>
> 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 <gerhard.petracek@gmail.com
> >:
> >
> >> 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 <gerhard.petracek@gmail.com
> >:
> >>
> >>> 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 <
> >>> jean-christophe.counio@oracle.com>:
> >>>
> >>>>
> >>>> 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 <
> >>>> jean-christophe.counio@oracle.com> 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 <
> >>>> gerhard.petracek@gmail.com> 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 <
> >>>> gerhard.petracek@gmail.com>:
> >>>>>>
> >>>>>>> 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 <
> >>>>>>> jean-christophe.counio@oracle.com>:
> >>>>>>>
> >>>>>>>> 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 <
> >>>> gerhard.petracek@gmail.com>
> >>>>>>>> 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
<
> >>>>>>>>> jean-christophe.counio@oracle.com>:
> >>>>>>>>>
> >>>>>>>>>> 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
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>
> >>>>
> >>>>
> >>>
> >>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message