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

Reply via email to