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 Sun, 08 Feb 2015 22:55:09 GMT
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 <
jean-christophe.counio@oracle.com>:

> 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 <gerhard.petracek@gmail.com>
> 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 <
> > 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