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

Reply via email to