Uploaded image for project: 'DeltaSpike'
  1. DeltaSpike
  2. DELTASPIKE-1230

use of ContextControl in CdiTestRunner blows up with NullPointerException

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.7.0, 1.7.1, 1.7.2
    • 1.8.0
    • TestControl
    • None

    Description

      i'm trying to implement a base test class with the annotation @RunWith(CdiTestRunner.class) and provide some utility methods for tests.

      to start a new request in a test method i'm using ContextControl to stop and start RequestContext and SessionContext.

      here are my cdi-ctrl dependencies

      <dependency>
        <groupId>org.apache.deltaspike.cdictrl</groupId>
        <artifactId>deltaspike-cdictrl-openejb</artifactId>
        <version>${deltaspike.version}</version>
        <scope>test</scope>
      </dependency>
      
      <dependency>
        <groupId>org.apache.tomee</groupId>
        <artifactId>openejb-core</artifactId>
        <version>7.0.2</version>
        <scope>test</scope>
      </dependency>
      

      with one test everything works fine but as soon as i've more the call to contextControl.stopContext(RequestScoped.class) (or any other scope) blows up with an NPE

      java.lang.NullPointerException
      	at java.util.Collections$UnmodifiableCollection.<init>(Collections.java:1026)
      	at java.util.Collections$UnmodifiableList.<init>(Collections.java:1302)
      	at java.util.Collections.unmodifiableList(Collections.java:1287)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.getActiveExternalContainers(CdiTestRunner.java:838)
      	at org.apache.deltaspike.testcontrol.impl.request.ContextControlDecorator.stopContext(ContextControlDecorator.java:108)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	at org.apache.webbeans.intercept.DecoratorHandler.invoke(DecoratorHandler.java:96)
      	at org.apache.deltaspike.cdise.owb.OpenWebBeansContextControl$$OwbInterceptProxy0.stopContext(org/apache/deltaspike/cdise/owb/OpenWebBeansContextControl.java)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	at org.apache.webbeans.intercept.AbstractInvocationContext.directProceed(AbstractInvocationContext.java:113)
      	at org.apache.webbeans.intercept.AbstractInvocationContext.proceed(AbstractInvocationContext.java:106)
      	at org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:67)
      	at org.apache.webbeans.intercept.DefaultInterceptorHandler.invoke(DefaultInterceptorHandler.java:139)
      	at org.apache.deltaspike.cdise.owb.OpenWebBeansContextControl$$OwbInterceptProxy0.stopContext(org/apache/deltaspike/cdise/owb/OpenWebBeansContextControl.java)
      	at at.rsandtner.sample.deltaspike.test.ContainerTest.cleanInstances(ContainerTest.java:40)
      	at at.rsandtner.sample.deltaspike.test.TestTwo.testSomething(TestTwo.java:50)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner$ContainerAwareMethodInvoker.invokeMethod(CdiTestRunner.java:346)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner$ContainerAwareMethodInvoker.evaluate(CdiTestRunner.java:318)
      	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.runChild(CdiTestRunner.java:177)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.runChild(CdiTestRunner.java:76)
      	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner$BeforeClassStatement.evaluate(CdiTestRunner.java:372)
      	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      	at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.run(CdiTestRunner.java:144)
      	at org.junit.runners.Suite.runChild(Suite.java:128)
      	at org.junit.runners.Suite.runChild(Suite.java:27)
      	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
      	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
      	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
      	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
      

      i've configured deltaspike.testcontrol.stop_container = false in src/test/resources/META-INF/apache-deltaspike.properties

      when booting the container for each test class it works but my goal is to start the container only once for all test in my module since this takes some time for bigger modules

      don't know if the fix is as trivial as it looks but adding

      if (cdiTestRunner == null || *cdiTestRunner.testContext.externalContainers == null*)

      {
    
          return Collections.emptyList();

      }
      

      fixes at least the NPE.

      or is there anything else i’m doing wrong?

      will upload a small sample but i'm currently on train and connection is really bad :/ so this can take some time

      Attachments

        1. deltaspike-test-sample.zip
          10 kB
          Reinhard Sandtner

        Activity

          People

            Unassigned Unassigned
            rsandtner Reinhard Sandtner
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: