1 Reply Latest reply on Jul 20, 2007 6:00 AM by chawax

    Problems with TestNG

    chawax

      Hi,

      I use AndroMDA to generate a project with EJB3. It generates test classes with TestNG, which use Jboss EJB3 embedded container.

      But when I run the tests, they fail with the following exception :

      java.lang.RuntimeException: java.net.MalformedURLException: no protocol: and


      The full stack trace :

      -------------------------------------------------------
       T E S T S
      -------------------------------------------------------
      WARN 20-07 10:19:43,713 (Ejb3Configuration.java:addXMLEntities:365) -Persistence provider caller does not implements the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null.
      WARN 20-07 10:19:44,119 (AnnotationBinder.java:bindClass:543) -Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: fr.horoquartz.t4.core.absence.DemandeAbsence
      WARN 20-07 10:19:47,230 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,324 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,371 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,464 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,527 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,589 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,652 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,902 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,965 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:47,980 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,027 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,074 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,105 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,136 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,168 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,230 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,262 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,340 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,387 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,418 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,449 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,496 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,543 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,715 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,762 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      WARN 20-07 10:19:48,777 (JBossTimerServiceFactory.java:restoreTimerService:112) -TIMER SERVICE IS NOT INSTALLED
      lookup
       CodeHoraireDao: org.jnp.interfaces.NamingContext
       I18nLibelleTraduitDao: org.jnp.interfaces.NamingContext
       I18nAttributDao: org.jnp.interfaces.NamingContext
       SectionHoraireDao: org.jnp.interfaces.NamingContext
       LigneDemandeAbsenceDao: org.jnp.interfaces.NamingContext
       RoleDao: org.jnp.interfaces.NamingContext
       JourneeEmployeDao: org.jnp.interfaces.NamingContext
       ServiceAbsenceBean: org.jnp.interfaces.NamingContext
       ServiceDemandeBean: org.jnp.interfaces.NamingContext
       ServiceEmployeBean: org.jnp.interfaces.NamingContext
       LigneProfilHoraireJournalierDao: org.jnp.interfaces.NamingContext
       ProfilHoraireJournalierDao: org.jnp.interfaces.NamingContext
       MotifAbsenceDao: org.jnp.interfaces.NamingContext
       AbsenceDao: org.jnp.interfaces.NamingContext
       UserTransaction: org.jboss.ejb3.embedded.UserTransactionImpl
       DemandeDao: org.jnp.interfaces.NamingContext
       EmployeDao: org.jnp.interfaces.NamingContext
       DemandeAbsenceDao: org.jnp.interfaces.NamingContext
       ServiceWorkflowBean: org.jnp.interfaces.NamingContext
       ServiceDeclarantBean: org.jnp.interfaces.NamingContext
       I18nLanguageDao: org.jnp.interfaces.NamingContext
       CompteUtilisateurDao: org.jnp.interfaces.NamingContext
       ServiceUtilisateurBean: org.jnp.interfaces.NamingContext
       LigneCodeHoraireDao: org.jnp.interfaces.NamingContext
       AttributionHoraireDao: org.jnp.interfaces.NamingContext
       I18nServiceBean: org.jnp.interfaces.NamingContext
       LigneAttributionHoraireDao: org.jnp.interfaces.NamingContext
      Running t4Seam Services Test
      WARN 20-07 10:19:48,918 (ServiceEmployeTest.java:testCreateEmploye:74) -Failed test testCreateEmploye()
      java.lang.RuntimeException: java.net.MalformedURLException: no protocol: and
       at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:281)
       at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:258)
       at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:58)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
       at $Proxy39.createEmploye(Unknown Source)
       at fr.horoquartz.t4.core.employe.test.ServiceEmployeTest.testCreateEmploye(ServiceEmployeTest.java:70)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:552)
       at org.testng.internal.Invoker.invokeMethod(Invoker.java:407)
       at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:778)
       at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
       at org.testng.TestRunner.privateRun(TestRunner.java:682)
       at org.testng.TestRunner.run(TestRunner.java:566)
       at org.testng.SuiteRunner.privateRun(SuiteRunner.java:220)
       at org.testng.SuiteRunner.run(SuiteRunner.java:146)
       at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:713)
       at org.testng.TestNG.runSuitesLocally(TestNG.java:676)
       at org.apache.maven.surefire.testng.TestNGExecutor.executeTestNG(TestNGExecutor.java:64)
       at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)
       at org.apache.maven.surefire.Surefire.run(Surefire.java:129)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:225)
       at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:747)
      Caused by: java.net.MalformedURLException: no protocol: and
       at java.net.URL.<init>(URL.java:567)
       at java.net.URL.<init>(URL.java:464)
       at java.net.URL.<init>(URL.java:413)
       at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:747)
       at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:147)
       at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
       at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
       at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
       at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544)
       at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
       at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
       at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1634)
       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
       at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
       at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
       at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:276)
       ... 29 more
      


      My test method :

      @org.testng.annotations.Test
       public void testCreateEmploye()
       {
       try
       {
       fr.horoquartz.t4.core.employe.ServiceEmployeRemote serviceEmploye = (fr.horoquartz.t4.core.employe.ServiceEmployeRemote)EJB3Container.getInitialContext().lookup("ServiceEmployeBean/remote");
      
       VOEmploye employe = new VOEmploye();
       employe.setAdresse("adresse");
       employe.setDateNaissance((new GregorianCalendar(1974, Calendar.SEPTEMBER, 7)).getTime());
       employe.setMail("mail");
       employe.setMatricule("000000");
       employe.setNom("nom");
       employe.setPays("FRANCE");
       employe.setPrenom("prenom");
       employe.setTelephone("00 00 00 00 00");
       employe.setVille("VILLE");
      
       serviceEmploye.createEmploye(employe);
       }
       catch (Exception ex)
       {
       logger.warn("Failed test testCreateEmploye()", ex);
       }
       }
      


      There is no error when I don't call the serviceEmploye.createEmploye() method, so I think there is no problem while finding the ServiceEmployeBean session bean in JNDI context. But it crashes when I call methods on this session bean.

      A piece of the ejb-jar.xml file :

      <session>
       <description>
       <![CDATA[
      
       ]]>
       </description>
       <ejb-name>ServiceEmployeBean</ejb-name>
       <remote>fr.horoquartz.t4.core.employe.ServiceEmployeRemote</remote>
       <ejb-class>fr.horoquartz.t4.core.employe.ServiceEmployeBean</ejb-class>
       <session-type>Stateless</session-type>
       <transaction-type>Container</transaction-type>
       </session>
      


      For what I understood, the EJB3 embedded container is started with this class :

      // license-header java merge-point
      //
      // Generated by: EJB3Container.vsl in andromda-ejb3-cartridge.
      //
      package fr.horoquartz.t4.seam.test;
      
      import java.util.Hashtable;
      
      import javax.naming.Context;
      import javax.naming.InitialContext;
      
      import org.apache.commons.logging.Log;
      import org.apache.commons.logging.LogFactory;
      import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap;
      import org.jboss.ejb3.embedded.EJB3StandaloneDeployer;
      
      import org.testng.annotations.Configuration;
      
      /**
       * Boots the JBoss Microcontainer with an EJB3 configuration.
       *
       * You can also use this class to lookup managed beans from JNDI.
       *
       * @author vancek
       * <p><b>Note</b>. code was copied from christian.bauer@jboss.com
       * example on Hibernate's CaveatEmptor application
       * </p>
       */
      public class EJB3Container
      {
       private final static Log logger = LogFactory.getLog(EJB3Container.class);
      
       private EJB3StandaloneDeployer deployer;
      
       @Configuration(beforeTest = true)
       public void startup()
       {
       try
       {
       logger.info("==>Bootstrapping EJB3 container...");
      
       // Boot the JBoss Microcontainer with EJB3 settings, loads ejb3-interceptors-aop.xml
       EJB3StandaloneBootstrap.boot(null);
      
      // Uncomment the following to enable security
      // logger.info("==>Deploying security-beans");
      // EJB3StandaloneBootstrap.deployXmlResource("security-beans.xml");
      // logger.info("==>Deployed security-beans");
      
      // logger.info("==>Deploying jboss-jms-beans - init JBoss MQ core services");
      // EJB3StandaloneBootstrap.deployXmlResource("jboss-jms-beans.xml");
      // logger.info("==>Deployed jboss-jms-beans");
      
      // logger.info("==>Configure test queue and topic");
      // EJB3StandaloneBootstrap.deployXmlResource("testjms.xml");
      // logger.info("==>Configured test queues and topics");
      
       logger.info("==>Deploying ejb3");
       EJB3StandaloneBootstrap.scanClasspath();
      
       // Add all EJBs found in the archive that has this file
       deployer = new EJB3StandaloneDeployer();
      
       // Deploy everything we got
       deployer.setKernel(EJB3StandaloneBootstrap.getKernel());
       deployer.create();
       logger.info("==>Deployer created");
       deployer.start();
       logger.info("==>Deployer started");
       logger.info("==>End of bootstrapping EJB3 container");
       }
       catch (Exception ex)
       {
       logger.error(ex.getMessage(), ex);
       throw new RuntimeException(ex);
       }
       }
      
       @Configuration(afterTest = true)
       public void shutdown()
       {
       try
       {
       logger.info("==>Invoking EJB3.shutdown...");
       deployer.stop();
       deployer.destroy();
       EJB3StandaloneBootstrap.shutdown();
       }
       catch (Exception ex)
       {
       throw new RuntimeException(ex);
       }
       }
      
       private static InitialContext initialContext = null;
       private static InitialContext securedInitialContext = null;
      
       /**
       * Return a new InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory,
       * setting the the default context.
       *
       * @return InitialContext
       * @throws Exception
       */
       public static InitialContext newInitialContext()
       throws Exception
       {
       Hashtable props = getInitialContextProperties();
       initialContext = new InitialContext(props);
       return initialContext;
       }
      
       /**
       * Return a new InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory,
       * setting the default context. Use the specified username and password to set the security context.
       *
       * @param principal
       * @param credential
       * @return InitialContext
       * @throws Exception
       */
       public static InitialContext newInitialContext(String principal, String credential)
       throws Exception
       {
       Hashtable props = getInitialContextProperties(principal, credential);
       securedInitialContext = new InitialContext(props);
       return securedInitialContext;
       }
      
       /**
       * Return the default InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory
       * if one is already instantiated, otherwise create a new InitialContext and set as the default.
       *
       * @return InitialContext
       * @throws Exception
       */
       public static InitialContext getInitialContext()
       throws Exception
       {
       if (initialContext == null)
       {
       Hashtable props = getInitialContextProperties();
       initialContext = new InitialContext(props);
       }
       return initialContext;
       }
      
       /**
       * Return the default InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory
       * if one is already instantiated, otherwise create a new InitialContext and set as the default.
       * Use the specified username and password to set the security context.
       *
       * @param principal
       * @param credential
       * @return
       * @throws Exception
       */
       public static InitialContext getInitialContext(String principal, String credential)
       throws Exception
       {
       if (securedInitialContext == null)
       {
       Hashtable props = getInitialContextProperties(principal, credential);
       securedInitialContext = new InitialContext(props);
       }
       return securedInitialContext;
       }
      
       private static Hashtable getInitialContextProperties()
       {
       Hashtable<String, String> props = new Hashtable<String, String>();
       props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.LocalOnlyContextFactory");
       props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
       return props;
       }
      
       private static Hashtable getInitialContextProperties(String principal, String credential)
       {
       Hashtable<String, String> props = new Hashtable<String, String>();
       props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
       props.put(Context.SECURITY_PRINCIPAL, principal);
       props.put(Context.SECURITY_CREDENTIALS, credential);
       return props;
       }
      }
      


      I am new to EJB3 and TestNG, so it looks like chinese to me. Any idea ?

        • 1. Re: Problems with TestNG
          chawax

          I solved my problem !
          The EJB3 embedded container was in a Maven 2 repository, and the directory for this repository had spaces in its name. I moved it to a directory with no spaces and there is no more problem. It looks like a bug in the Jboss embedded EJB3 container.