0 Replies Latest reply on Nov 10, 2013 11:21 PM by Jianbao Tao

    Arquillian with embedded glassfish gives random fails

    Jianbao Tao Newbie

      I am using Arquillian and embedded glassfish for testing in a new project. I have written 7 test classes. They all pass if I test them individually. I use gradle. And here is how I test an individual class:

      ./gradlew test -Dtest.single=SomeClassTest
      
      

       

      I use a refactoring trick to avoid creating @Deployment archive in each individual test class, which is to wrap the @Deployment into an abstract class, and each test class extends this class. The abstract base class looks like this:

      @RunWith( Arquillian.class )
      public abstract class ArquillianJUnitWar {
          @Deployment
          public static WebArchive createDeployment() {
              WebArchive war = ShrinkWrap.create( WebArchive.class, "test.war" )
                      .addPackages( true, Filters.exclude( ".*Test.*" ),
                              "project.package", "arquillian.stub", "arquillian.util" )
                      .addClasses( Foo.class )
                      .addAsWebInfResource( "beans-test.xml", "beans.xml" )
                      .addAsWebInfResource( "web-test.xml", "web.xml" )
                      .addAsResource( "persistence-test.xml", "META-INF/persistence.xml" );
              return war;
          }  
      }
      
      

       

      And a test class will look like this:

      public class SomeClassTest extends ArquillianJUnitWar {
          @Test
          public void testSomeMethod() {
              // do something
          }
      }
      
      

       

      I have used this trickin a previous project where I used Arquillian and embedded weld-se for testing. It worked fine then.

       

      However, I get random fails this time, and I am not sure if this refactoring trick has anything to do with the fails. But just in case.

       

      In any case, when I run a clean full test with

      ./gradlew clean test
      
      

      The tests I have will fail randomly. As aforementioned, they all pass in individual test runs.

       

      One of the stack traces of the random fails looks like this:

      java.lang.RuntimeException: Could not inject members
          at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:135)
          at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.enrich(CDIInjectionEnricher.java:78)
          at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:52)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
          at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
          at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
          at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:89)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
          at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
          at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:75)
          at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
          at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
          at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:60)
          at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
          at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
          at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
          at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)
          at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.before(EventTestRunnerAdaptor.java:95)
          at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:222)
          at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
          at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
          at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240)
          at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
          at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
          at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
          at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
          at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
          at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
          at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
          at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
          at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185)
          at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
          at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
          at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199)
          at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
          at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
          at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:65)
          at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:160)
          at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:126)
          at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:90)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
          at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
          at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
          at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
          at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
          at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
          at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
          at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
          at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
          at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
          at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
          at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
          at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
          at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
          at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
          at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
          at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
          at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
          at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
          at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
          at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
          at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
          at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
          at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
          at java.lang.Thread.run(Thread.java:724)
      Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456 Argument resolvedBean must not be null
          at org.jboss.weld.util.Preconditions.checkArgumentNotNull(Preconditions.java:40)
          at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:751)
          at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
          at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:368)
          at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:377)
          at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:72)
          at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:60)
          at org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66)
          at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:142)
          at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
          at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64)
          at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:91)
          at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:145)
          at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125)
          ... 84 more
      
      

       

      These are my dependencies:

      dependencies {
          compile 'org.codehaus.groovy:groovy-all:2.1.9'
          providedCompile 'javax:javaee-api:7.0'
          providedCompile 'org.eclipse.persistence:org.eclipse.persistence.core:2.5.0'
          compile 'org.slf4j:slf4j-api:1.7.5'
          runtime 'ch.qos.logback:logback-classic:1.0.13'
          runtime 'ch.qos.logback:logback-core:1.0.13'
          testCompile 'junit:junit:4.11'
          testCompile 'org.mockito:mockito-all:1.9.5'
          testRuntime 'org.glassfish.main.extras:glassfish-embedded-all:4.0'
          testCompile 'org.jboss.arquillian:arquillian-bom:1.1.1.Final'
          testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.1.1.Final'
          testCompile 'org.jboss.arquillian.container:arquillian-glassfish-embedded-3.1:1.0.0.CR4'
          testRuntime 'org.hsqldb:hsqldb:2.3.0'
          testRuntime 'mysql:mysql-connector-java:5.1.27'
      }
      

       

      So, any help?