JSFUnit 2.0 and Tomcat 6

    Hello, guys!

     

    I am new to JSF Unit and  Arquillian. Now trying to launch JSFUnit tests on Tomcat server. I tried to start managed, remote and even embeded tomcat configuration but nothing works. I always got some errors. I believe it somehow connected with version conflicts between Arquillian, Tomcat and JSFUnit.

     

    So here is my pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.jboss.jsfunit</groupId>
        <artifactId>gettingstarted</artifactId>
        <version>2.0.0.Beta2</version>
        <packaging>war</packaging>
        <name>Minimal example for the Getting Started Guide</name>
    
        <repositories>
            <repository>
                <id>jboss-public-repository-group</id>
                <name>JBoss Public Maven Repository Group</name>
                <url>https://repository.jboss.org/nexus/content/groups/public</url>
                <layout>default</layout>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>never</updatePolicy>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                    <updatePolicy>never</updatePolicy>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>jboss-public-repository-group</id>
                <name>JBoss Public Repository Group</name>
                <url>http://repository.jboss.org/nexus/content/groups/public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
        <properties>
            <version.jsfunit>2.0.0.Beta2</version.jsfunit>
            <version.arquillian>1.0.0.CR4</version.arquillian>
            <version.arquillian.jboss>1.0.0.CR2</version.arquillian.jboss>
            <version.shrinkwrap>1.0.0-beta-5</version.shrinkwrap>
            <version.shrinkwrap.descriptors>1.1.0-alpha-2</version.shrinkwrap.descriptors>
            <version.jboss_60>6.0.0.Final</version.jboss_60>
        </properties>
    
        <dependencies>
    
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8.2</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.arquillian.junit</groupId>
                <artifactId>arquillian-junit-container</artifactId>
                <version>${version.arquillian}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.arquillian.protocol</groupId>
                <artifactId>arquillian-protocol-servlet</artifactId>
                <version>${version.arquillian}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.arquillian.container</groupId>
                <artifactId>arquillian-container-spi</artifactId>
                <version>${version.arquillian}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.jboss.spec.javax.faces</groupId>
                <artifactId>jboss-jsf-api_2.0_spec</artifactId>
                <version>1.0.0.Final</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.spec.javax.servlet</groupId>
                <artifactId>jboss-servlet-api_3.0_spec</artifactId>
                <version>1.0.0.Final</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.jsfunit</groupId>
                <artifactId>jsfunit-arquillian</artifactId>
                <version>${version.jsfunit}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.jsfunit</groupId>
                <artifactId>jboss-jsfunit-core</artifactId>
                <version>${version.jsfunit}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.shrinkwrap.descriptors</groupId>
                <artifactId>shrinkwrap-descriptors-impl</artifactId>
                <version>${version.shrinkwrap.descriptors}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.shrinkwrap.resolver</groupId>
                <artifactId>shrinkwrap-resolver-api-maven</artifactId>
                <version>${version.shrinkwrap}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.jboss.shrinkwrap.resolver</groupId>
                <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
                <version>${version.shrinkwrap}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>javax.faces</groupId>
                <artifactId>jsf-api</artifactId>
                <version>2.1</version>
    
            </dependency>
            <dependency>
                <groupId>javax.faces</groupId>
                <artifactId>jsf-impl</artifactId>
                <version>2.0.2-FCS</version>
    
            </dependency>
    
            <dependency>
                <groupId>org.jboss.jsfunit</groupId>
                <artifactId>jboss-jsfunit-richfaces</artifactId>
                <version>2.0.0.Beta1</version>
            </dependency>
    
        </dependencies>
    
        <profiles>
    
            <profile>
                <id>tomcat-embedded</id>
                <dependencies>
                    <dependency>
                        <groupId>org.jboss.arquillian.container</groupId>
                        <artifactId>arquillian-tomcat-embedded-6</artifactId>
                        <version>1.0.0.Final-SNAPSHOT</version>
                        <scope>test</scope>
                    </dependency>
                    <dependency>
                        <groupId>org.apache.tomcat</groupId>
                        <artifactId>catalina</artifactId>
                        <version>6.0.29</version>
                        <scope>test</scope>
                    </dependency>
                    <dependency>
                        <groupId>org.apache.tomcat</groupId>
                        <artifactId>coyote</artifactId>
                        <version>6.0.29</version>
                        <scope>provided</scope>
                    </dependency>
                    <dependency>
                        <groupId>org.apache.tomcat</groupId>
                        <artifactId>jasper</artifactId>
                        <version>6.0.29</version>
                        <scope>provided</scope>
                    </dependency>
                    <!-- Weld servlet, EL and JSP required for testing CDI injections -->
                    <dependency>
                        <groupId>org.jboss.weld.servlet</groupId>
                        <artifactId>weld-servlet</artifactId>
                        <version>1.0.1-Final</version>
                        <scope>test</scope>
                    </dependency>
                    <dependency>
                        <groupId>org.glassfish.web</groupId>
                        <artifactId>el-impl</artifactId>
                        <version>2.2</version>
                        <scope>test</scope>
                    </dependency>
                    <dependency>
                        <groupId>javax.servlet.jsp</groupId>
                        <artifactId>jsp-api</artifactId>
                        <version>2.2</version>
                        <scope>test</scope>
                    </dependency>
                </dependencies>
            </profile>
    
    
        </profiles>
    </project>
    
    

     

    arquillian.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://jboss.org/schema/arquillian
                 http://jboss.org/schema/arquillian/arquillian-1.0.xsd">
    
        <engine>
            <property name="deploymentExportPath">target/</property>
        </engine>
    
        <container qualifier="tomcat" default="true">
            <configuration>
                <property name="unpackArchive">true</property>
                <property name="user">tomcat</property>
                <property name="pass">tomcat</property>
            </configuration>
        </container>
    
        <defaultProtocol type="Servlet 2.5" />
    
    </arquillian>
    

     

    web.xml

    <?xml version="1.0"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    
        <listener>
            <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
        </listener>
    
      <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
      </servlet-mapping>
    
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
      </welcome-file-list>
    
        <servlet>
        <servlet-name>ServletTestRunner</servlet-name>
        <servlet-class>org.jboss.arquillian.protocol.servlet_3.ServletTestRunner</servlet-class>
        </servlet>
        <servlet-mapping>
        <servlet-name>ServletTestRunner</servlet-name>
        <url-pattern>/ArquillianServletRunner</url-pattern>
        </servlet-mapping>
    
    
    </web-app>
    

     

    HelloJsfTest class from JSFUnit gettingstarted tutorial:

    @RunWith(Arquillian.class)
    public class HelloJSFTest
    {
        // property surefire sys prop setting
        public static final boolean IS_JETTY = (System.getProperty("jetty-embedded") != null);
    
        @Deployment
        public static WebArchive createDeployment() {
            WebArchive war =
                    ShrinkWrap.create(WebArchive.class, "test.war")
                            .setWebXML(new File("src/main/webapp/WEB-INF/web.xml"))
                            .addPackage(Package.getPackage("org.jboss.jsfunit.example.hellojsf")) // my test package
                            .addAsWebResource(new File("src/main/webapp", "index.xhtml"))
                            .addAsWebInfResource(new File("src/main/webapp/WEB-INF/faces-config.xml"), "faces-config.xml");
            System.out.println(war.toString(true)); // for debugging
            return war;
        }
    
        @Test
        @InitialPage("/index.faces")
        public void testInitialPage(JSFServerSession server, JSFClientSession client) throws IOException
        {
            // Test navigation to initial viewID
            Assert.assertEquals("/index.xhtml", server.getCurrentViewID());
    
            // Set the param and submit
            client.setValue("name", "Stan");
            client.click("submit_button");
    
            // Assert that the greeting component is in the component tree and rendered
            UIComponent greeting = server.findComponent("greeting");
            Assert.assertTrue(greeting.isRendered());
    
            System.out.println("\nHALLO WORD from testInitialPage method!");
    
            // Test a managed bean using EL. We cheat and use the request object.
            Assert.assertEquals("Stan", server.getManagedBeanValue("#{request.getParameter('form1:name')}"));
        }
    
    
    }
    
    

     

    Result of running this configuration is following:

    Method createDeployment  successfully launched, I  see the war.toString in the output.

    But  testInitialPage is not launched. There is an error in surefire-reports log. here is it:

    Could not inject method parameters

    at org.jboss.jsfunit.arquillian.container.JSFUnitTestEnricher.resolve(JSFUnitTestEnricher.java:89)

    at org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.enrichArguments(LocalTestExecuter.java:94)

    at org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.execute(LocalTestExecuter.java:60)

    ...

     

    Caused by: java.lang.NullPointerException

    at org.jboss.jsfunit.arquillian.container.JSFUnitSessionFactory.findJSFSession(JSFUnitSessionFactory.java:85)

     

     

     

     

    First remark: if I change

    <defaultProtocol type="Servlet 2.5" />
    

    to

    <defaultProtocol type="Servlet 3.0" />
    

    then I got

     

     

    java.lang.IllegalArgumentException: ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer.

    at org.jboss.arquillian.protocol.servlet.ServletUtil.determineBaseURI(ServletUtil.java:68)

     

    but servlet org.jboss.arquillian.protocol.servlet_3.ServletTestRunner is specified in web.xml

     

    Second remark: when I try to launch the same project on JBoss(remote or managed) everything works fine.

     

    Any suggestions?

     

    Thanks!!