Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » JBoss User Help »

[jboss-user] [EJB 3.0] - Problems with TestNG

scott.stark@jboss.org

2007-07-20


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@(protected)
| * 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 ?

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4066082#4066082

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4066082
_______________________________________________
jboss-user mailing list
jboss-user@(protected)
https://lists.jboss.org/mailman/listinfo/jboss-user
©2008 junlu.com - Jax Systems, LLC, U.S.A.