@WarpTest causes @ArquillianResource NullPointerException
mschink Dec 5, 2017 4:24 PMHi there! First time using Arquillian, and it's been a blast. I'm hoping to get started with Warp from a very basic Drone/Graphene webapp running JSF on a Tomcat 8.5 Embedded container. I'm using Weld to enable CDI. Because I'm trying to keep the webapp and the test code separate, I'm relying on ShrinkWrap to import the webapp WAR file and classes. My setup for the webapp is very basic simple - the problem is when I start to use Warp and @ArquillianResources.
Here is the LoginTest class with the @WarpTest annotation which causes the error. Note: removing the ONE line 25. @WarpTest resolves the problem immediately. But I need it to be a @WarpTest so I may do some server-side assertions.
import java.io.File; import java.net.URL; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.runner.RunWith; import org.jboss.arquillian.drone.api.annotation.Drone; import static org.jboss.arquillian.graphene.Graphene.guardAjax; import static org.jboss.arquillian.graphene.Graphene.guardHttp; import org.jboss.arquillian.graphene.findby.FindByJQuery; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.arquillian.warp.WarpTest; import org.jboss.shrinkwrap.api.importer.ZipImporter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; @RunWith(Arquillian.class) @WarpTest @RunAsClient public class LoginTest { @Deployment public static WebArchive createDeployment() { WebArchive webArchive = ShrinkWrap.create(ZipImporter.class, "WebAppToImport.war").importFrom(new File("target/WebAppToImport.war")) .as(WebArchive.class); System.out.println(webArchive.toString(true)); return webArchive; } @Drone private WebDriver browser; @ArquillianResource private URL deploymentURL; @FindBy(id = "userName") private WebElement userName; @FindBy(id = "password") private WebElement password; @FindBy(id = "login") private WebElement loginButton; @FindBy(tagName = "li") // 2. injects a first element with given tag name private WebElement facesMessage; @FindByJQuery("p:visible") // 3. injects an element using jQuery selector private WebElement signedAs; @FindBy(css = "input[type=submit]") private WebElement whoAmI; @Test public void login_is_succesful() { browser.get(deploymentURL.toExternalForm() + "login.xhtml"); userName.sendKeys("demo"); password.sendKeys("demo"); guardHttp(loginButton).click(); assertEquals("Welcome", facesMessage.getText().trim()); guardAjax(whoAmI).click(); assertTrue(signedAs.getText().contains("demo")); } }
Here is my pom.xml with some groupId's redacted
<groupId>...</groupId> <artifactId>WebAppToImportTesting</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <!-- This keeps Arquillian Drone versioning consistent --> <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-drone-bom</artifactId> <version>2.0.1.Final</version> <scope>import</scope> <type>pom</type> </dependency> <!-- This keeps Arquillian versioning consistent --> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.1.14.Final</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- JUnit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- Arquillian JUnit Container --> <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> <!-- Arquillian Graphene contains Drone as well --> <dependency> <groupId>org.jboss.arquillian.graphene</groupId> <artifactId>graphene-webdriver</artifactId> <version>2.1.0.Final</version> <type>pom</type> <scope>test</scope> </dependency> <!-- Arquillian Warp --> <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-warp-jsf</artifactId> <version>1.0.0.Alpha8</version> </dependency> <!-- WebAppToImport Classes --> <dependency> <groupId>...</groupId> <artifactId>WebAppToImport</artifactId> <version>1.0-SNAPSHOT</version> <classifier>classes</classifier> <scope>test</scope> </dependency> </dependencies> <profiles> <profile> <id>tomcat-remote</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <!-- JavaEE spec --> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-7.0</artifactId> <version>1.0.3.Final</version> <type>pom</type> <scope>provided</scope> </dependency> <!-- Weld Container --> <dependency> <groupId>org.jboss.arquillian.container</groupId> <artifactId>arquillian-weld-ee-embedded-1.1</artifactId> <version>1.0.0.CR9</version> <scope>test</scope> </dependency> <!-- CDI --> <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core</artifactId> <version>2.3.5.Final</version> <scope>test</scope> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.4</version> <scope>test</scope> </dependency> </dependencies> </profile> <profile> <id>arquillian-tomcat-embedded</id> <dependencies> <!-- Faces API --> <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!-- Mojarra Impl of Faces API --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.2.15</version> <scope>runtime</scope> </dependency> <!-- The above seems to be missing the EL implementation --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>el-impl</artifactId> <version>2.2</version> <scope>runtime</scope> </dependency> <!-- EE compile-time reference --> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> <!-- CDI compile-time reference --> <dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <!-- Arquillian Container --> <dependency> <groupId>org.jboss.arquillian.container</groupId> <artifactId>arquillian-tomcat-embedded-8</artifactId> <version>1.0.0.CR10</version> <scope>test</scope> </dependency> <!-- Tomcat Embedded --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.16</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>8.5.16</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-logging-juli</artifactId> <version>8.5.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>3.7</version> <scope>test</scope> </dependency> <!-- Weld servlet for testing CDI injections --> <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet</artifactId> <version>2.3.5.Final</version> <scope>test</scope> </dependency> </dependencies> </profile> </profiles> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.0.2</version> <executions> <execution> <id>copy-compiled</id> <phase>compile</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <!-- WebAppToImport WAR --> <groupId>...</groupId> <artifactId>WebAppToImport</artifactId> <version>1.0-SNAPSHOT</version> <type>war</type> <destFileName>WebAppToImport.war</destFileName> </artifactItem> </artifactItems> <outputDirectory>${project.build.directory}</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> </build>
And finally the full stack trace of the error I'm getting.
java.lang.NullPointerException: null at org.jboss.arquillian.warp.impl.client.proxy.ProxyUsageTracker.registerOperationalContextToUrl(ProxyUsageTracker.java:75) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:62) at org.jboss.arquillian.warp.impl.client.proxy.ProxyURLProvider.getProxyUrl(ProxyURLProvider.java:96) at org.jboss.arquillian.warp.impl.client.proxy.ProxyURLProvider.lookup(ProxyURLProvider.java:85) at org.jboss.arquillian.graphene.location.ContextRootStoreInitializer.getContextRoot(ContextRootStoreInitializer.java:54) at org.jboss.arquillian.graphene.location.ContextRootStoreInitializer.setupLocationForClass(ContextRootStoreInitializer.java:47) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:62) at org.jboss.arquillian.junit.RulesEnricher.enrichInstances(RulesEnricher.java:83) at org.jboss.arquillian.junit.RulesEnricher.enrichStatement(RulesEnricher.java:77) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:128) at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createBeforeContext(ContainerEventController.java:114) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95) at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:116) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95) at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:83) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95) at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:69) 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:498) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.fireCustomLifecycle(EventTestRunnerAdaptor.java:142) at org.jboss.arquillian.junit.Arquillian$7.evaluate(Arquillian.java:281) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 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.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:174) at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:376) at org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:54) at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:185) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:140) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Thanks so much in advance for reading the post - I hope I was clear. I suspect I am running into some issues with Maven dependencies not lining up?
Cheers,
Morgan