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

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
    

Reply via email to