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 11:26:52 GMT
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