2016-12-16 19:04 GMT+01:00 Xavier Dury <[email protected]>: > Hi Romain, > > thanks for the answer, I should have thought about the rules ordering. > Normally, I always use RuleChain when I write my own tests, but for once, I > took an existing test (https://github.com/apache/ > tomee/blob/master/container/openejb-core/src/test/java/ > org/apache/openejb/junit/ScopesRuleTest.java) ... and now, after reading > your explanation, I don't really see what this test is actually testing as > the request context is always active... ;-) > > fixed
> Xavier > > > > From: Romain Manni-Bucau <[email protected]> > Sent: Friday, December 16, 2016 6:52 PM > To: [email protected] > Subject: Re: Problem with openejb.testing.start-cdi-contexts = false and > application composer > > Hi Xavier, > > first test doesnt pass cause app composer runs the test as an EJB > (ManagedBean actually) and therefore inherits from the auto request scope > for it. RequestScoped is quite particular cause often implicit so switching > it off is quite an issue for a lot of tests - it explains why it is still > on even if ScopesRule is active. We can think to a way to force it to be > disabled but I think it would need to be another flag to not break too much > tests (like new ScopesRule(disableRequestScope) or something like that). > > regarding "is this a bug" the answer is no. > > > > > > > > > > > ok ok, I'll explain why ;). This is a conflict between junit runner and > rules, you need to migrate to app composer rule (which is as hard as > removing the runner and using ApplicationComposerRule) and chain it in an > ordered manner with the scope rule: > > > @ContainerProperties({ > @ContainerProperties.Property(name = > "openejb.testing.start-cdi-contexts", value = "false") > }) > @org.apache.openejb.testing.Classes(cdi = true, innerClassesAsBean = true) > public class ScopesRuleTest { > @Rule > public final TestRule rule = RuleChain.outerRule(new > ApplicationComposerRule(this)).around(new ScopesRule()); > > public static class Foo { > public void touch() { > // ok > } > } > > @Inject > private BeanManager beanManager; > > @Test > public void scopeDoesNotExist() { > assertFalse(beanManager.getContext(RequestScoped. > class).isActive()); > } > > @Test > @CdiScopes(RequestScoped.class) > public void scopeExists() { > assertTrue(WebBeansContext.currentInstance().getContextsService(). > getCurrentContext(RequestScoped.class).isActive()); > } > } > > > > > > Romain Manni-Bucau > @rmannibucau <https://twitter.com/rmannibucau> | Blog > <https://blog-rmannibucau.rhcloud.com> | Old Blog > > > RBlog: the RManniBucau v2 Blog > blog-rmannibucau.rhcloud.com > RBlog: Romain Manni-Bucau Blog about Java, JavaEE, TomEE, Angular, Open > Source, Code and geeky topics... > <http://rmannibucau.wordpress.com> | Github <https://github.com/ > rmannibucau> | > > > [old blog] new RManniBucau().blog() > rmannibucau.wordpress.com > New blog on: https://blog-rmannibucau.rhcloud.com/ > LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE Factory > <https://javaeefactory-rmannibucau.rhcloud.com> > > 2016-12-16 18:37 GMT+01:00 Xavier Dury <[email protected]>: > > > Hi, > > > > I have a problem with the following test (with TomEE 7.0.1): > > > > @ContainerProperties(@ContainerProperties.Property(name = > > "openejb.testing.start-cdi-contexts", value = "false")) > > @Classes(cdi = true, innerClassesAsBean = true) > > @RunWith(ApplicationComposer.class) > > public class ScopesRuleTest { > > public static class Foo { > > public void touch() {} > > } > > > > @Rule > > public final ScopesRule rule = new ScopesRule(); > > > > @Inject > > private BeanManager beanManager; > > > > @Test > > public void scopeDoesNotExist() { > > Assert.assertFalse(beanManager.getContext( > > RequestScoped.class).isActive()); > > } > > > > @Test > > @CdiScopes(RequestScoped.class) > > public void scopeExists() { > > Assert.assertTrue(beanManager.getContext( > > RequestScoped.class).isActive()); > > } > > } > > > > The scopes should not be started but the first test gives an assertion > > error (so the RequestContext is well started although that's not what I > > wanted) and the second one gives a NPE: > > > > java.lang.NullPointerException > > at org.apache.openejb.util.AppFinder.findAppContextOrWeb( > > AppFinder.java:28) > > at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get( > > ThreadSingletonServiceImpl.java:287) > > at org.apache.openejb.cdi.ThreadSingletonServiceImpl.getContext( > > ThreadSingletonServiceImpl.java:267) > > at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get( > > ThreadSingletonServiceImpl.java:327) > > at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get( > > ThreadSingletonServiceImpl.java:64) > > at org.apache.webbeans.config.WebBeansFinder.getSingletonInstance( > > WebBeansFinder.java:51) > > at org.apache.webbeans.config.WebBeansContext.getInstance( > > WebBeansContext.java:185) > > at org.apache.webbeans.config.WebBeansContext.currentInstance( > > WebBeansContext.java:203) > > at org.apache.openejb.junit.ScopesRule$1.evaluate( > ScopesRule.java:42) > > at org.junit.rules.RunRules.evaluate(RunRules.java:20) > > > > If I remove the first test, the second one passes. > > > > Is this a bug? > > > > Thanks, > > > > Xavier > >
