deltaspike-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jean-Christophe Counio <jean-christophe.cou...@oracle.com>
Subject Re: JerseyTest mock support
Date Wed, 04 Feb 2015 22:28:38 GMT
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
View raw message