1 Reply Latest reply on Sep 17, 2010 8:02 AM by Aslak Knutsen

    ServletMethodExecution in Arquillian assumes "test" context

    jaikiran pai Master

      I've got a Arquillian (1.0.0.alpha-3) IN_CONTAINER test running against JBoss AS 6 (trunk) remote. The test is simple - it just deploys a WebArchive and does a lookup of a EJB that's deployed in the .war (AS6 supports EJB deployments in .war):

       

      @RunWith(Arquillian.class)
      @Run(RunModeType.IN_CONTAINER)
      public class JNDIAccessTestCase
      {
      
         private static final String MODULE_NAME = "hello";
         
         
         @Deployment
         public static WebArchive createDeployment() throws Exception
         {
            return ShrinkWrap.create(WebArchive.class, MODULE_NAME + ".war").addPackage(JNDIAccessTestCase.class.getPackage());
         }
         
         @Test
         public void testSimpleJNDIAccess() throws Exception
         {
            Context ctx = new InitialContext();
            Echo bean = (Echo) ctx.lookup("blah");
            String echo = bean.echo("msg");
         }
      }
      

       

      As you can see, I just deploy the hello.war. While running this test, I keep running into the following exception and Arquillian fails to fire the testcase:

       

      Caused by: java.lang.IllegalStateException: Error launching test org.jboss.bean.integration.test.jndi.JNDIAccessTestCase public void org.jboss.bean.integration.test.jndi.JNDIAccessTestCase.testSimpleJNDIAccess() throws java.lang.Exception
          at org.jboss.arquillian.protocol.servlet_3.ServletMethodExecutor.invoke(ServletMethodExecutor.java:61)
          at org.jboss.arquillian.impl.handler.ContainerTestExecuter.callback(ContainerTestExecuter.java:50)
          at org.jboss.arquillian.impl.handler.ContainerTestExecuter.callback(ContainerTestExecuter.java:40)
          at org.jboss.arquillian.impl.event.MapEventManager.fire(MapEventManager.java:63)
          ... 26 more
      Caused by: java.lang.IllegalStateException: Error launching test at http://localhost:8080/test/ArquillianServletRunner?outputMode=serializedObject&className=org.jboss.bean.integration.test.jndi.JNDIAccessTestCase&methodName=testSimpleJNDIAccess. Kept on getting 404s.
          at org.jboss.arquillian.protocol.servlet_3.ServletMethodExecutor.execute(ServletMethodExecutor.java:125)
          at org.jboss.arquillian.protocol.servlet_3.ServletMethodExecutor.invoke(ServletMethodExecutor.java:57)
          ... 29 more
          
      

       

      So it appears that Arquillian deploys the hello.war (at hello context) and then tries to run the in-container test by using the hardcoded "test" context. This is what I see in org.jboss.arquillian.protocol.servlet_3.ServletMethodExecutor.invoke:

       

      public TestResult invoke(TestMethodExecutor testMethodExecutor) 
         {
            if(testMethodExecutor == null) 
            {
               throw new IllegalArgumentException("TestMethodExecutor must be specified");
            }
            
            Class<?> testClass = testMethodExecutor.getInstance().getClass();
            String url = baseURL.toExternalForm() + "test/ArquillianServletRunner" +  
                              "?outputMode=serializedObject&className=" + testClass.getName() + 
                              "&methodName=" + testMethodExecutor.getMethod().getName();
            
            try 
            {
               return execute(url);
            } 
            catch (Exception e) 
            {
               throw new IllegalStateException("Error launching test " + testClass.getName() + " " + testMethodExecutor.getMethod(), e);
            }
         }