Problems with TestNG
chawax Jul 20, 2007 5:19 AMHi,
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 ?