Side note: you can also use a JUnit @Rule ;) 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 Gerhard Petracek <gerhard.petra...@gmail.com>: > 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 <it-media.k...@daimler.com>: > >> 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:strub...@yahoo.de] >> > Gesendet: Freitag, 7. Februar 2014 09:29 >> > An: dev@deltaspike.apache.org >> > 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, "it-media.k...@daimler.com" <it- >> > media.k...@daimler.com> 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:rmannibu...@gmail.com] >> > >> Gesendet: Freitag, 7. Februar 2014 08:55 >> > >> An: dev@deltaspike.apache.org >> > >> 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 <it-media.k...@daimler.com>: >> > >> > 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:rmannibu...@gmail.com] >> > >> >> Gesendet: Freitag, 7. Februar 2014 08:26 >> > >> >> An: dev@deltaspike.apache.org >> > >> >> 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 <it-media.k...@daimler.com>: >> > >> >> > 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. >> >>