Bruno, It seems that your example isn't complete enough. You have deltaspike.testcontrol.mock-support.allow_mocked_beans=true enabled, however you're not using it (in the example). How are you using mocked beans in your real test?
John On Tue, Oct 17, 2017 at 6:56 AM Bruno Boissard <[email protected]> wrote: > John -> Yes you found the sources and reproduced my issue. > Gerhard -> It's a pity that the mock functionality implies to have a > request context. > Using your code proposal make cdi-test work but in the real thing the > threads are not created explicitely by me so it will be harder to have them > creating the request context, and only in case of tests. > > It would have been nice to have the mock functionality working without > request context but I will implement your workaround and create the request > context in the separated thread. > > Thanks. > > > 2017-10-17 12:26 GMT+02:00 Gerhard Petracek <[email protected]>: > > > hi bruno, > > > > you don't have a request-scoped bean, but the mock-functionality you > > enabled (via config) is based on the request-scoped bean you mentioned. > > it's needed to support different mocks (across tests). > > > > -> if MyThread is part of your test-code, just add the parts i've > mentioned > > in my previous answer. > > (otherwise use MyTestThread which extends MyThread for your tests + add > the > > additional behavior there...) > > > > regards, > > gerhard > > > > > > > > 2017-10-17 11:58 GMT+02:00 John D. Ament <[email protected]>: > > > > > Bruno, > > > > > > When I run your project (assuming you meant : > > > https://github.com/rt15/cdi-test ) This is the exception I get, which > > > matches to what Gerhard is describing to you: > > > > > > javax.enterprise.context.ContextNotActiveException: WebBeans context > > with > > > scope type annotation @RequestScoped does not exist within current > thread > > > at > > > org.apache.webbeans.container.BeanManagerImpl.getContext( > > > BeanManagerImpl.java:331) > > > at > > > org.apache.webbeans.intercept.NormalScopedBeanInterceptorHan > > > dler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:88) > > > at > > > org.apache.webbeans.intercept.RequestScopedBeanInterceptorHa > > > > ndler.getContextualInstance(RequestScopedBeanInterceptorHandler.java:76) > > > at > > > org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.get( > > > NormalScopedBeanInterceptorHandler.java:70) > > > at > > > org.apache.deltaspike.testcontrol.impl.mock.SimpleMockManager$$ > > > OwbNormalScopeProxy0.getMock(org/apache/deltaspike/ > > testcontrol/impl/mock/ > > > SimpleMockManager.java) > > > at > > > org.apache.deltaspike.testcontrol.impl.mock. > > MockAwareInjectionTargetWrappe > > > r.produce(MockAwareInjectionTargetWrapper.java:59) > > > at > > > org.apache.webbeans.component.AbstractOwbBean.create( > > > AbstractOwbBean.java:122) > > > at > org.apache.webbeans.component.ManagedBean.create(ManagedBean.java:67) > > > at > > > org.apache.webbeans.context.creational.BeanInstanceBag. > > > create(BeanInstanceBag.java:76) > > > at > > > org.apache.webbeans.context.AbstractContext.getInstance( > > > AbstractContext.java:159) > > > at org.apache.webbeans.context.AbstractContext.get( > > > AbstractContext.java:125) > > > at > > > org.apache.webbeans.intercept.NormalScopedBeanInterceptorHan > > > dler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:100) > > > at > > > org.apache.webbeans.intercept.ApplicationScopedBeanInterceptorHandler. > > > getContextualInstance(ApplicationScopedBeanInterceptorHandler.java:65) > > > at > > > org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.get( > > > NormalScopedBeanInterceptorHandler.java:70) > > > at fr.rt15.MyBean$$OwbNormalScopeProxy0.foo(fr/rt15/MyBean.java) > > > at fr.rt15.MyThread.run(MyThread.java:13) > > > > > > On Tue, Oct 17, 2017 at 5:04 AM Bruno Boissard < > [email protected] > > > > > > wrote: > > > > > > > Hi Gerhard, > > > > > > > > It would make sense to start a request context in order to be able to > > > > access a @RequestScoped bean but my bean is @ApplicationScoped. > Should > > it > > > > not be accessible without starting a request context? > > > > > > > > But while searching for my bean, in deltaspike > > > > MockAwareInjectionTargetWrapper, a DynamicMockManager is searched: > > > > > > > > DynamicMockManager mockManager = > > > > BeanProvider.getContextualReference(this.beanManager, > > > > DynamicMockManager.class, false); > > > > > > > > It returns a SimpleMockManager that is @RequestScoped so it cannot be > > > used > > > > without a created request context. > > > > > > > > Maybe MockAwareInjectionTargetWrapper should use > > > > SimpleApplicationMockManager (Which is @ApplicationScoped) when we > ask > > > for > > > > an @ApplicationScoped bean? > > > > > > > > Regards. > > > > > > > > 2017-10-17 10:20 GMT+02:00 Gerhard Petracek <[email protected]>: > > > > > > > > > hi bruno, > > > > > > > > > > if you start your own threads, you have to control some scopes like > > the > > > > > request-scope on your own (>within< those new threads). > > > > > (that isn't specific to deltaspike) > > > > > > > > > > see a similar part [1] in our documentation. > > > > > > > > > > regards, > > > > > gerhard > > > > > > > > > > [1] > > > > > http://deltaspike.apache.org/documentation/container-control.html# > > > > > AttachaRequestContexttoaNewThreadinEE > > > > > > > > > > > > > > > > > > > > 2017-10-17 9:55 GMT+02:00 Bruno Boissard <[email protected] > >: > > > > > > > > > > > Hello, > > > > > > > > > > > > I am using deltaspike 1.8.0 and owb version 1.6.3. > > > > > > > > > > > > My test which has to be executed with CdiTestRunner, is starting > a > > > new > > > > > > thread. > > > > > > This thread retrieves an instance of MyBean from CDI and try to > use > > > it. > > > > > > MyBean is @ApplicationScoped. > > > > > > > > > > > > It works fine unless I add in apache-deltaspike.properties: > > > > > > deltaspike.testcontrol.mock-support.allow_mocked_beans=true > > > > > > (It is necessary for some other tests. As well as > > > stop_container=false > > > > is > > > > > > also necessary). > > > > > > > > > > > > With allow_mocked_beans=true I have following exception: > > > > > > javax.enterprise.context.ContextNotActiveException: WebBeans > > context > > > > > with > > > > > > scope type annotation @RequestScoped does not exist within > current > > > > thread > > > > > > > > > > > > It appears that while searching for MyBean, it is searching for > > > > > > SimpleMockManager bean. > > > > > > SimpleMockManager is @RequestScoped, so deltaspike does not find > it > > > > > > (Logical, there is no request context as we are in a new thread). > > > > > > > > > > > > A very ugly workaround is to use MyBean in MyTest: once it is > > > created, > > > > it > > > > > > become accessible in the other thread... > > > > > > Is there a better solution? > > > > > > > > > > > > A maven project corresponding to this available in github, please > > > > search > > > > > > for rt15/cdi-test. > > > > > > > > > > > > > > > > > > Otherwise here is the source code: > > > > > > ======================================================= > > > > > > @RunWith(CdiTestRunner.class) > > > > > > public class MyTest { > > > > > > > > > > > > @Inject > > > > > > private MyBean myBean; > > > > > > > > > > > > @Test > > > > > > public void test() throws Exception { > > > > > > > > > > > > // Ugly workaround: uncomment next line. > > > > > > // this.myBean.foo(); > > > > > > > > > > > > MyThread myThread = new MyThread(); > > > > > > myThread.start(); > > > > > > myThread.join(); > > > > > > if (myThread.exception != null) { > > > > > > throw myThread.exception; > > > > > > } > > > > > > } > > > > > > } > > > > > > ======================================================= > > > > > > public class MyThread extends Thread { > > > > > > > > > > > > public Exception exception; > > > > > > > > > > > > @Override > > > > > > public void run() { > > > > > > try { > > > > > > MyBean myBean = CDI.current().select(MyBean. > > > class).get(); > > > > > > myBean.foo(); > > > > > > } catch (Exception e) { > > > > > > this.exception = e; > > > > > > } > > > > > > } > > > > > > } > > > > > > ======================================================= > > > > > > @ApplicationScoped > > > > > > public class MyBean { > > > > > > > > > > > > public void foo() { > > > > > > System.out.println("foo"); > > > > > > } > > > > > > } > > > > > > ======================================================= > > > > > > deltaspike.testcontrol.mock-support.allow_mocked_beans=true > > > > > > ======================================================= > > > > > > > > > > > > Regards. > > > > > > > > > > > > > > > > > > > > >
