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

Reply via email to