关于单元测试的问题,小弟新接触

Seto 2007-08-18
运行测试,显示local server not initialized怎么解决,之前一直没用TDD,写出来的代码质量好低。。我现在终于下定决心搞Seam的单元测试,没想到一测试就这样子的错误。。testng的classpath为mc的conf,ejb3 all的包

ResourceTest.java
public class ResourceTest {

	    @Test
	    public void testResource()
	    {
	        EntityManager em = getEntityManagerFactory().createEntityManager();
	        em.getTransaction().begin();
	        
	        Resource temp = new Resource();
	        temp.setTag("test");
	        temp.setName("test");
	        temp.setUrl("test");
	        
	        em.persist(temp);
	        
	        assert "test".equals( temp.getTag());
	        
	        assert "test".equals( temp.getName());
	        
	        assert "test".equals( temp.getUrl());
	        
	        assert temp.getId()!=null;
	        
	        em.getTransaction().commit();
	        em.close();
	    }
	    
	    
	    private EntityManagerFactory emf;
	    
	    public EntityManagerFactory getEntityManagerFactory()
	    {
	        return emf;
	    }
	    
	    @Configuration(beforeTestClass=true)
	    public void init() 
	    {
	        emf = Persistence.createEntityManagerFactory("KDC");
	    }
	    
	    @Configuration(afterTestClass=true)
	    public void destroy()
	    {
	        emf.close();
	    }


}


persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
             version="1.0">
             
   <persistence-unit name="KDC">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/KDCDatasource</jta-data-source>
      <properties>
         <property name="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>
         <property name="hibernate.show_sql" value="true"/>
         <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
         <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
      </properties>
   </persistence-unit>
    
</persistence>


KDC-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
   
   <local-tx-datasource>
      <jndi-name>KDCDatasource</jndi-name>
      <connection-url>jdbc:mysql://localhost:3306/test</connection-url>
      <driver-class>com.mysql.jdbc.Driver</driver-class>
      <user-name>root</user-name>
      <password>test</password>
<!-- 
      <exception-sorter-class-name>
         org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
      </exception-sorter-class-name>
      <metadata>
         <type-mapping>mySQL</type-mapping>
      </metadata>
-->
   </local-tx-datasource>
    
</datasources>


console
02:53:33,578 ERROR [NamingHelper] Could not obtain initial context
javax.naming.NamingException: Local server is not initialized
	at org.jnp.interfaces.LocalOnlyContextFactory.getInitialContext(LocalOnlyContextFactory.java:45)
	at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
	at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
	at javax.naming.InitialContext.init(Unknown Source)
	at javax.naming.InitialContext.<init>(Unknown Source)
	at org.hibernate.util.NamingHelper.getInitialContext(NamingHelper.java:28)
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
	at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
	at com.domain.KDC.test.ResourceTest.init(ResourceTest.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:604)
	at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:394)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:79)
	at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:165)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:103)
	at org.testng.TestRunner.runWorkers(TestRunner.java:678)
	at org.testng.TestRunner.privateRun(TestRunner.java:624)
	at org.testng.TestRunner.run(TestRunner.java:495)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:300)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:295)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:275)
	at org.testng.SuiteRunner.run(SuiteRunner.java:190)
	at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:792)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:765)
	at org.testng.TestNG.run(TestNG.java:699)
	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:122)
02:53:33,578 FATAL [DatasourceConnectionProvider] Could not find datasource: java:/KDCDatasource
javax.naming.NamingException: Local server is not initialized
	at org.jnp.interfaces.LocalOnlyContextFactory.getInitialContext(LocalOnlyContextFactory.java:45)
	at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
	at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
	at javax.naming.InitialContext.init(Unknown Source)
	at javax.naming.InitialContext.<init>(Unknown Source)
	at org.hibernate.util.NamingHelper.getInitialContext(NamingHelper.java:28)
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
	at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
	at com.domain.KDC.test.ResourceTest.init(ResourceTest.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:604)
	at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:394)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:79)
	at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:165)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:103)
	at org.testng.TestRunner.runWorkers(TestRunner.java:678)
	at org.testng.TestRunner.privateRun(TestRunner.java:624)
	at org.testng.TestRunner.run(TestRunner.java:495)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:300)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:295)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:275)
	at org.testng.SuiteRunner.run(SuiteRunner.java:190)
	at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:792)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:765)
	at org.testng.TestNG.run(TestNG.java:699)
	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:122)
FAILED CONFIGURATION: @BeforeClass init
javax.persistence.PersistenceException: org.hibernate.HibernateException: Could not find datasource
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:720)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
	at com.domain.KDC.test.ResourceTest.init(ResourceTest.java:47)
Caused by: org.hibernate.HibernateException: Could not find datasource
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:56)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
	at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
	... 26 more
Caused by: javax.naming.NamingException: Local server is not initialized
	at org.jnp.interfaces.LocalOnlyContextFactory.getInitialContext(LocalOnlyContextFactory.java:45)
	at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
	at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
	at javax.naming.InitialContext.init(Unknown Source)
	at javax.naming.InitialContext.<init>(Unknown Source)
	at org.hibernate.util.NamingHelper.getInitialContext(NamingHelper.java:28)
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)
	... 32 more
... Removed 22 stack frames
Seto 2007-08-18
谁能给我说说classpath该如何设置才能正常单元测试么?
zaya 2007-08-20
单元测试里,如果你没有启动jboss,jndi是没有的,所以datasourceye 没有。 如果你想测试数据库,可以把PU配置成连接j2se,而不是jndi.

<persistence-unit name="yourPU" transaction-type="RESOURCE_LOCAL">
并把jta-data-source 删了。

如果你想用jndi测试,得用jboss-embedded. 推荐做法是用org.jboss.seam.mock.SeamTest,具体看seam手册测试那节。

你目前这种做法,除非是把embedded配置好,然后手动调用
org.jboss.embedded.Bootstrap bootstrap = org.jboss.embedded.Bootstrap.getInstance();
bootstrap.bootstrap();
启动服务器。
Seto 2007-08-20
谢谢啊,解决了。。我在官方上找到问题解决方法了。。就跟你说的那样
xxqn 2007-10-06
容器内测试难呀。
nbaertuo 2007-10-21
能不能把你做好的单元测试上传一个啊,感觉配置好麻烦啦
coolfish 2007-12-11
如果要测试的seam组件是pojo的话,那么没有必要启动embedded jboss.

我遇到的问题是,如果将 META-INF/persistence.xml 和 java代码放在一起的话,启动embedded jboss ,错误:
Caused by: java.lang.ClassCastException: org.jboss.net.protocol.vfsfile.VirtualFileURLConnection
at org.jboss.virtual.plugins.context.VfsArchiveBrowserFactory.create(VfsArchiveBrowserFactory.java:47)
at org.jboss.util.file.ArchiveBrowser.getBrowser(ArchiveBrowser.java:63)
at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:626)
... 61 more
启动hibernate 扫描持久化类的时候出错.大家有没有碰到类似的错误呢?
tearaskflower 2009-12-16
兄弟,怎么解决的,哪个官网?是testNG吗
Global site tag (gtag.js) - Google Analytics