hi heiko,

you can use CdiTestRunner + configure true for:
deltaspike.testcontrol.use_test_class_as_cdi_bean

regards,
gerhard

http://www.irian.at

Your JSF/JavaEE powerhouse -
JavaEE Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces



2014-02-07 <[email protected]>:

> Hello Mark,
>
> thank you for your input. Your idea would have been much easier than what
> I did :-)
>
> When you write a Junit Runner, you have the ability to control the test
> class creation by overwriting createTest() and returning your instance. By
> default this is simply the newInstance() call for the constructor with no
> arguments of the test class. The following code will therefore not only
> provide injection but even create a fully creational contexted bean that
> even will trigger interceptors. I've made sure though, that after calling
> all 'AfterClass'-Annotations, the creational context is released too, so
> the bean does not stick around.
>
> I do not really have a clue though how this could be done with TestNg.
>
> I might miss out some clearContexts() here. I thought about cleaning the
> contexts before a new test-method is run, however I loose all beans
> discovered and created while the container booted, and that lead to failing
> tests. I need the container being created BEFORE createTest() is called to
> be able to do the bean creation. I have to dive into this more deeply.
> Another Idea would be to simply boot the container again before each method
> and shut it down afterwards, though this will slow down tests.
>
> public class TestRunner extends BlockJUnit4ClassRunner
> {
>     private Class<?> clazz;
>     private CreationalContext<?> creationalContext;
>
>     public TestRunner(final Class<?> clazz) throws InitializationError
>     {
>         super(clazz);
>
>         this.clazz = clazz;
>
>         cdiContainer = CdiContainerLoader.getCdiContainer();
>         cdiContainer.boot();
>         cdiContainer.getContextControl().startContexts();
>     }
>
>     @Override
>     protected Object createTest()
>         throws Exception
>     {
>         return createTest(clazz);
>     }
>
>     @SuppressWarnings("unchecked")
>     private <T> T createTest(final Class<T> testClass) throws Exception
>     {
>         final BeanManager beanManager = cdiContainer.getBeanManager();
>
>         final Set<Bean<?>> beans = beanManager.getBeans(testClass);
>
>         assert !beans.isEmpty();
>
>         final Bean<?> bean = beans.iterator().next();
>         creationalContext = beanManager.createCreationalContext(bean);
>
>         final T result = (T) beanManager.getReference(bean, testClass,
> creationalContext);
>
>         return result;
>     }
>
>     @Override
>     protected Statement withAfterClasses(final Statement statement)
>     {
>         final Statement defaultStatement =
> super.withAfterClasses(statement);
>
>         return new Statement()
>         {
>
>             @Override
>             public void evaluate()
>                 throws Throwable
>             {
>                 try
>                 {
>                     defaultStatement.evaluate();
>                 }
>                 finally
>                 {
>                     creationalContext.release();
>                 }
>             }
>
>         };
>     }
>
> Regards,
>
> Heiko
>
> > -----Ursprüngliche Nachricht-----
> > Von: Mark Struberg [mailto:[email protected]]
> > Gesendet: Freitag, 7. Februar 2014 09:29
> > An: [email protected]
> > Betreff: Re: AW: Interceptors not being called in JUnit-aware CDI
> environment
> >
> > =========================================================
> > ======
> >
> > ATTENTION! This message contains suspicious URL(s) possibly redirecting
> to
> > malicious content. Our security gateways target known problem URLs like
> > freeweb or URL Shorteners that are being abused by spammers. Some
> > examples would be groups.google.com or tinyurl.com. Please check the
> sender
> > and hyperlinks in the e-mail accurately before clicking on a link. If
> this email
> > seems obviously bad to you please delete it.  More information is
> available on
> > our website Information Security @ Daimler:
> http://intra.corpintra.net/intra-
> > is-e/spam
> >
> > =========================================================
> > ======
> >
> > ACHTUNG! Diese E-Mail enthält verdächtige URLs welche möglicherweise auf
> > schädlichen Inhalt verweisen. Die Security Gateways prüfen auf bekannte
> > Problem-URLs  wie zum Beispiel URL-Abkürzungen, die bevorzugt von
> > Spammern mißbraucht werden (tinyurl.com, groups.google.com, ...). Bitte
> > prüfen Sie den Absender und die URLs in dieser E-Mail gewissenhaft bevor
> sie
> > die verknüpften Inhalte aufrufen. Bitte löschen Sie diese E-Mail, wenn
> Sie der
> > Meinung sind, daß sich der Verdacht bestätigt. Weitere Informationen zu
> > unerwünschter E-Mail / SPAM finden Sie auf den Seiten der
> > Informationssicherheit bei Daimler unter:
> http://intra.corpintra.net/intra-is-
> > d/spam
> >
> > =========================================================
> > ======
> >
> >
> > Hi Heiko!
> >
> > Afaik all unit runners (junit, testng) do create and manage the test
> class
> > instances themselfs. We only do injection into those existing instances.
> With
> > other words: we just fill the injection points. Whenever I need to have
> an
> > intercepted method, I create a public static inner class in my test.
> E.g. when I
> > need a @Transactional DbHelper with a cleanup() method which should run
> in
> > an own transaction.
> >
> > private @Inject DbHelper dbHelper;
> >
> > pubic static class DbHelper {
> >   private @Inject EntityManager em;
> >    @Transactional
> >    public void cleanupDb() {
> >      em.....
> >   }
> > }
> >
> > @Before
> > public void doCleanup() {
> >   cleanInstances() // restart session and request scoped context
> >   dbHelper.cleanupDb();
> >
> >   cleanInstances() // again to ensure the test has clean instances and
> the em
> > got closed
> >
> > }
> >
> > LieGrue,
> > strub
> >
> >
> >
> >
> > On Friday, 7 February 2014, 9:13, "[email protected]" <it-
> > [email protected]> wrote:
> >
> > Hey Romain,
> > >
> > >that was the missing piece of the puzzle and lets me step down in
> > embarrassment for such an idiotic mistake. I've had the assumtion that
> for a
> > maven surefire test, the beans.xml provided in
> src/main/resources/META-INF
> > which IS obviously used, is enough, but after you pointed this out, I
> simply
> > added another one under src/test/resources/META-INF and voilá, getBeans()
> > returns a Bean that I can retrieve an instance from, that indeed will
> make
> > interceptors work.
> > >
> > >Thank you very much for your help,
> > >
> > >Heiko
> > >
> > >> -----Ursprüngliche Nachricht-----
> > >> Von: Romain Manni-Bucau [mailto:[email protected]]
> > >> Gesendet: Freitag, 7. Februar 2014 08:55
> > >> An: [email protected]
> > >> Betreff: Re: Interceptors not being called in JUnit-aware CDI
> > >> environment
> > >>
> > >>
> > =========================================================
> > >> ======
> > >>
> > >> ATTENTION! This message contains suspicious URL(s) possibly
> > >> redirecting to malicious content. Our security gateways target known
> > >> problem URLs like freeweb or URL Shorteners that are being abused by
> > >> spammers. Some examples would be groups.google.com or tinyurl.com.
> > >> Please check the sender and hyperlinks in the e-mail accurately
> > >> before clicking on a link. If this email seems obviously bad to you
> > >> please delete it.  More information is available on our website
> > >> Information Security @ Daimler: http://intra.corpintra.net/intra-
> > >> is-e/spam
> > >>
> > >>
> > =========================================================
> > >> ======
> > >>
> > >> ACHTUNG! Diese E-Mail enthält verdächtige URLs welche möglicherweise
> > >> auf schädlichen Inhalt verweisen. Die Security Gateways prüfen auf
> > >> bekannte Problem-URLs  wie zum Beispiel URL-Abkürzungen, die
> > >> bevorzugt von Spammern mißbraucht werden (tinyurl.com,
> > >> groups.google.com, ...). Bitte prüfen Sie den Absender und die URLs
> > >> in dieser E-Mail gewissenhaft bevor sie die verknüpften Inhalte
> > >> aufrufen. Bitte löschen Sie diese E-Mail, wenn Sie der Meinung sind,
> > >> daß sich der Verdacht bestätigt. Weitere Informationen zu
> > >> unerwünschter E-Mail / SPAM finden Sie auf den Seiten der
> > >> Informationssicherheit bei Daimler unter:
> > >> http://intra.corpintra.net/intra-is-
> > >> d/spam
> > >>
> > >>
> > =========================================================
> > >> ======
> > >>
> > >>
> > >> is you test class scanned by cdi? I mean did you provide a META-
> > >> INF/beans.xml for tests?
> > >> Romain Manni-Bucau
> > >> Twitter: @rmannibucau
> > >> Blog: http://rmannibucau.wordpress.com/
> > >> LinkedIn: http://fr.linkedin.com/in/rmannibucau
> > >> Github: https://github.com/rmannibucau
> > >>
> > >>
> > >>
> > >> 2014-02-07  <[email protected]>:
> > >> > Hello Romain,
> > >> >
> > >> > thank you for your fast response. Yes I want to intercept the test
> itself.
> > >> >
> > >> > I've checked into various ways on how to actually create a bean,
> > >> > however
> > >> nothing worked out. You mention to call beanManager.getXXX() but for
> > >> my point that is not enough information.
> > >> >
> > >> > I tried to retrieve the beans of the test class via
> > >> > beanManager.getBeans() but
> > >> regardless of what I try as annotation literals there (non, Any,
> > >> etc.) nothing works, the list is always empty. What method exactly
> > >> did you have in mind here?
> > >> >
> > >> > Thanks,
> > >> >
> > >> > Heiko
> > >> >
> > >> >> -----Ursprüngliche Nachricht-----
> > >> >> Von: Romain Manni-Bucau [mailto:[email protected]]
> > >> >> Gesendet: Freitag, 7. Februar 2014 08:26
> > >> >> An: [email protected]
> > >> >> Betreff: Re: Interceptors not being called in JUnit-aware CDI
> > >> >> environment
> > >> >>
> > >> >>
> > >>
> > =========================================================
> > >> >> ======
> > >> >>
> > >> >> ATTENTION! This message contains suspicious URL(s) possibly
> > >> >> redirecting to malicious content. Our security gateways target
> > >> >> known problem URLs like freeweb or URL Shorteners that are being
> > >> >> abused by spammers. Some examples would be groups.google.com or
> > tinyurl.com.
> > >> >> Please check the sender and hyperlinks in the e-mail accurately
> > >> >> before clicking on a link. If this email seems obviously bad to
> > >> >> you please delete it.  More information is available on our
> > >> >> website Information Security @ Daimler:
> > >> >> http://intra.corpintra.net/intra- is-e/spam
> > >> >>
> > >> >>
> > >>
> > =========================================================
> > >> >> ======
> > >> >>
> > >> >> ACHTUNG! Diese E-Mail enthält verdächtige URLs welche
> > >> >> möglicherweise auf schädlichen Inhalt verweisen. Die Security
> > >> >> Gateways prüfen auf bekannte Problem-URLs  wie zum Beispiel
> > >> >> URL-Abkürzungen, die bevorzugt von Spammern mißbraucht werden
> > >> >> (tinyurl.com, groups.google.com, ...). Bitte prüfen Sie den
> > >> >> Absender und die URLs in dieser E-Mail gewissenhaft bevor sie die
> > >> >> verknüpften Inhalte aufrufen. Bitte löschen Sie diese E-Mail, wenn
> > >> >> Sie der Meinung sind, daß sich der Verdacht bestätigt. Weitere
> > >> >> Informationen zu unerwünschter E-Mail / SPAM finden Sie auf den
> > >> >> Seiten der Informationssicherheit bei Daimler unter:
> > >> >> http://intra.corpintra.net/intra-is-
> > >> >> d/spam
> > >> >>
> > >> >>
> > >>
> > =========================================================
> > >> >> ======
> > >> >>
> > >> >>
> > >> >> HI
> > >> >>
> > >> >> You want to intercept the test? so it means the runner needs to
> > >> >> invoke "business" methods of the test class which is not the case
> > >> >> by default (ie result shouldn't be built from a newInstance() but
> > >> >> from a
> > >> beanManager.getXXX()).
> > >> >> Romain Manni-Bucau
> > >> >> Twitter: @rmannibucau
> > >> >> Blog: http://rmannibucau.wordpress.com/
> > >> >> LinkedIn: http://fr.linkedin.com/in/rmannibucau
> > >> >> Github: https://github.com/rmannibucau
> > >> >>
> > >> >>
> > >> >>
> > >> >> 2014-02-07  <[email protected]>:
> > >> >> > Hello,
> > >> >> >
> > >> >> > I've been trying to start the CDI container during Junit-Testing
> > >> >> > as described at the following page,
> > >> >> >
> > >> >> > http://struberg.wordpress.com/2012/03/27/unit-testing-
> > strategies
> > >> >> > -fo
> > >> >> > r-c
> > >> >> > di-based-projects/
> > >> >> >
> > >> >> > though I'm using Junit 4 and implemented everything using a new
> > >> >> > Runner (to
> > >> >> annotate tests with @RunWith). I kind of got inspired by he
> > >> >> CDIUnit project, but it works only with Weld and I want to use
> > OpenWebBeans.
> > >> >> > The major things like injection work perfectly, however, I
> > >> >> > realized, that even
> > >> >> though I implemented the following code to provided a CDI aware
> > >> >> Test-Class, an interceptor annotation on a test method is
> > >> >> completely ignored, thus the interceptors AroundInvoke annotated
> > method is not called.
> > >> >> >
> > >> >> >     private <T> T createTest(final Class<T> testClass) throws
> > >> >> >Exception
> > >> >> >     {
> > >> >> >         final BeanManager beanManager =
> > >> >> >cdiContainer.getBeanManager();
> > >> >> >
> > >> >> >         final CreationalContext<T> creationalContext =
> > >> >> >beanManager.createCreationalContext(null);
> > >> >> >
> > >> >> >         final AnnotatedType<T> annotatedType =
> > >> >> beanManager.createAnnotatedType(testClass);
> > >> >> >         final InjectionTarget<T> injectionTarget =
> > >> >> >beanManager.createInjectionTarget(annotatedType);
> > >> >> >
> > >> >> >         final T result = (T)
> > >> >> > getTestClass().getOnlyConstructor().newInstance();
> > >> >> >
> > >> >> >         injectionTarget.inject(result, creationalContext);
> > >> >> >
> > >> >> >         return result;
> > >> >> >     }
> > >> >> >
> > >> >> > Is this expected behaviour? I'm not so familiar with how
> > >> >> > interceptors are really implemented, but I would have guest that
> > >> >> > after providing a creational context and complete injection for
> > >> >> > the test class, interceptor annotations should work too. The
> > >> >> > interceptor itself is registered correctly. It is listed among
> > >> >> > all interceptors when calling
> > >> >> >
> > >> >> > WebBeansContext.currentInstance().getInterceptorsManager().getCd
> > >> >> > iIn
> > >> >> > ter
> > >> >> > ceptors()
> > >> >> >
> > >> >> > however, a test annotated with the interceptor does not trigger
> > >> >> > execution of
> > >> >> the AroundInvoke-method.
> > >> >> >
> > >> >> > Would be great, if somebody has a thought or a hint on this.
> > >> >> >
> > >> >> > Thanks,
> > >> >> >
> > >> >> > Heiko
> > >> >> >
> > >> >> >
> > >> >> > If you are not the addressee, please inform us immediately that
> > >> >> > you have
> > >> >> received this e-mail by mistake, and delete it. We thank you for
> > >> >> your
> > >> support.
> > >
> > >> >> >
> > >> >
> > >> > If you are not the addressee, please inform us immediately that you
> > >> > have
> > >> received this e-mail by mistake, and delete it. We thank you for your
> > support.
> > >> >
> > >
> > >If you are not the addressee, please inform us immediately that you have
> > received this e-mail by mistake, and delete it. We thank you for your
> support.
> > >
> > >
> > >
>
> If you are not the addressee, please inform us immediately that you have
> received this e-mail by mistake, and delete it. We thank you for your
> support.
>
>

Reply via email to