2011-07-22 57 views
0

我試圖爲我的DAO對象創建一個JUnit測試。 JUnit直接從Netbeans運行。我對這些技術中的一些技術相當陌生,因此我有一段時間追溯我的錯誤來自哪裏。我的代碼和我看到相應的錯誤是:錯誤運行JUnit測試(JPA,德比,休眠,吉斯)

2011年7月22日下午7時09分09秒 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient信息:找不到JavaDB之外客戶端jar文件,德比jdbc 驅動程序默認情況下不可用。 FATAL [DatasourceConnectionProvider] - 找不到數據源:Waylon org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001:連接失敗: socketType:IIOP_CLEAR_TEXT;主機名:localhost;端口:3700 vmcid: OMG次要代碼:1已完成:否javax.naming.NamingException:查找 'Waylon'失敗 SerialContext [myEnv = {java.naming.factory.initial = com.sun.enterprise.naming。 impl.SerialInitContextFactory, java.naming.factory.url.pkgs = com.sun.enterprise.naming, java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [根異常是javax.naming.NamingException:無法獲取 SerialContextProvider for SerialContext [myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url。 pkgs = com.sun.enterprise.naming, java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.J NDIStateFactoryImpl} [根異常是org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001: 連接失敗:socketType:IIOP_CLEAR_TEXT;主機名:localhost; 端口:3700 vmcid:OMG次要代碼:1完成:否]]在 sun.reflect.GeneratedConstructorAccessor31.newInstance(未知來源) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java: 518) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 在java.lang.reflect中。 Constructor.newInstance(Constructor.java:513) at javax.naming.InitialContext.lookup(InitialContext.java:392)at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension。 java:248) 在 com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95) 在 org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387) 在 org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 在 的com.sun .corba.ee.spi.orbutil.logex.WrapperGenerator.access $ 400(WrapperGenerator.java:107) at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator $ 2.invoke(WrapperGenerator.java:511) 在 org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 在 com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99) at org.hibernate.cfg.Configuration.buildSettings(Configuration。Java的:2009) 在$ Proxy40.connectFailure(來源不明)在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 在 com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl(。 SocketOrChannelConnectionImpl.java:257) 在 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 在 com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl。(SocketOrChannelConnectionImpl.java:270) 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.create連接(SocketOrChannelContactInfoImpl.java:129) 在 com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:223) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java: 126) 在 com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:228) 在javax.persistence.Persistence.createEntityManagerFactory(未知 源)在 com.sun.corba.ee .impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:393) at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)at javax.persistence.Persisten ce.createEntityManagerFactory(未知 源)在 org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69) 在 com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 在 com.sun.enterprise.naming.impl.SerialContext $ ProviderCacheKey.getNameService(SerialContext.java:1241) 在waylon.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java:36)在 com.sun.enterprise.naming。 impl.SerialContext.getRemoteProvider(SerialContext.java:411) 在 com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 com.sun.enterprise.naming.impl .SerialContext.lookup(SerialContext.java:455) 處 java.lang中 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在javax.naming.InitialContext.lookup(InitialContext.java:392)。反應。方法.invoke(Method.java:597)在 org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java: 44) 在 org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 在 org.hibernate.ejb .InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) 在 org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41 ) 在 org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 在 組織。junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 在 org.junit.internal.runners.statements。 RunAfters.evaluate(RunAfters.java:31) 在 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 在org.junit.runners.ParentRunner.run(ParentRunner.java:303)在 組織.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 在junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistenc e.java:126) 在 org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518) 在javax.persistence.Persistence.createEntityManagerFactory(未知 來源)在 組織.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906) 在javax.persistence.Persistence.createEntityManagerFactory(未知 源)在 com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 在waylon.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java: 36) 引起: javax.naming.NamingException:無法獲取 SerialContextProvider for SerialContext [myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs = com .sun.enterprise.naming, java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [根異常是org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001: 連接失敗:socketType:IIOP_CLEAR_TEXT;主機名:localhost; 端口:3700 vmcid:OMG次要代碼:1已完成:否]在 sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法) com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) ...更多在 太陽29。 reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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_2_0.xsd"> 
    <persistence-unit name="WaylonPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>Waylon</jta-data-source> 
    <class>waylon.label.Label</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

我下測試DAO:

package waylon.label.impl; 

import com.google.inject.Inject; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.TypedQuery; 
import waylon.label.Label; 
import waylon.label.LabelDAO; 

/** 
* {@inheritDoc} 
*/ 
public class LabelDAOImpl implements LabelDAO { 

    private final EntityManager em; 

    @Inject 
    public LabelDAOImpl(EntityManager em) { 
     this.em = em; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public List<Label> getAllLabels() throws Exception { 
     TypedQuery<Label> typedQuery = em.createQuery(
       "SELECT * from LABEL", Label.class); 
     return typedQuery.getResultList(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public Label createLabel(String name) throws Exception { 
     em.getTransaction().begin(); 
     Label label = new Label(); 
     label.setName(name); 
     em.persist(label); 
     em.getTransaction().commit(); 
     return label; 
    } 

    /** 
    * {@inheritDoc} 
    */  
    @Override 
    public void removeLabel(String name) throws Exception { 
     Label label = getLabel(name); 
     removeLabel(label); 
    } 

    /** 
    * {@inheritDoc} 
    */  
    @Override 
    public Label getLabel(String name) throws Exception { 
     Label label = em.find(Label.class, name); 
     return label; 
    } 

    /** 
    * {@inheritDoc} 
    */  
    @Override 
    public void removeLabel(Label label) throws Exception { 
     if (null != label) { 
      em.getTransaction().begin(); 
      em.remove(label); 
      em.getTransaction().commit(); 
     } 
    } 
} 

我的JUnit測試:

package waylon.label; 

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.persist.PersistService; 
import com.google.inject.persist.jpa.JpaPersistModule; 
import java.util.List; 
import static org.hamcrest.MatcherAssert.*; 
import static org.hamcrest.Matchers.*; 
import org.hamcrest.core.IsEqual; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import waylon.label.impl.LabelDAOModule; 

/** 
* A JUnit Test to test our database connection and JPA code. 
* @author Benjamin Bays 
*/ 
public class LabelDAOIJTest { 

    private LabelDAO objectInTest = null; 

    private static final String PUNIT = "WaylonPU"; 
    private static Injector injector = null; 
    private static PersistService persistService = null; 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
     injector = Guice.createInjector( 
       new JpaPersistModule(PUNIT), 
       new LabelDAOModule()); 
     persistService = injector.getInstance(PersistService.class); 
     persistService.start(); 
    } 

    @AfterClass 
    public static void tearDownClass() throws Exception { 
     persistService.stop(); 
    } 

    @Before 
    public void setUp() { 
     objectInTest = injector.getInstance(LabelDAO.class); 
    } 

    @Test 
    public void doEverything() throws Exception { 
     final String testName = "Test Label"; 
     Label label1 = objectInTest.createLabel(testName); 
     assertThat(label1.getName(), IsEqual.equalTo(testName)); 

     Label label2 = objectInTest.getLabel(testName); 
     assertThat(label2.getName(), IsEqual.equalTo(testName)); 

     final String testName3 = "Test Label3"; 
     Label label3 = objectInTest.createLabel(testName3); 
     assertThat(label3.getName(), IsEqual.equalTo(testName3));   

     List<Label> allLabels = objectInTest.getAllLabels(); 
     assertThat(allLabels, hasItems(label1, label3)); 

     objectInTest.removeLabel(label1); 
     objectInTest.removeLabel(testName3); 
     List<Label> noLabels = objectInTest.getAllLabels(); 
     assertThat(noLabels.size(), IsEqual.equalTo(0)); 
    } 
} 

任何幫助將不勝感激。謝謝。

回答

5

這花了很長時間才弄清楚。我認爲這裏的總體教訓是一次只學習一種新技術。我提供了一系列讓我的JUnit運行的步驟,但總的來說,這是RTFM解決的幾個錯誤。

爲了在應有的地方給予獎勵,這些資源非常有用。

  1. http://blogs.oracle.com/geertjan/entry/embedded_database_for_netbeans_platform
  2. http://platform.netbeans.org/tutorials/nbm-crud.html
  3. Eclipslink - Unknown entity type

我開始使用第一資源重建我的數據庫服務。這涉及到重新創建每個表並重新建立外鍵依賴關係(討厭,但是必要的)。

然後我跟着第二個教程讓netbeans從我的數據庫表中自動生成一個實體。我的實體不需要更改,但這確實會導致Netbeans生成一個persistence.xml。我比較它針對我自己,並用這部分想出了:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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_2_0.xsd"> 
    <persistence-unit name="LabelDAOIJTest" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>waylon.label.Label</class> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby:Waylon;create=true"/> 
     <property name="javax.persistence.jdbc.password" value="app"/> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/> 
     <property name="javax.persistence.jdbc.user" value="app"/> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

大這裏的變化是:

  1. (在
  2. 在連接字符串的變化的變化,這是指向到內存DB我設置)。
  3. 將ddl-generation屬性設置爲「drop-and-create-tables」。

最後,我的單元測試跑了,萬歲!只是爲了弄清楚,我的生產代碼中存在錯誤(因爲我是JPA的總新手)。我所做的更改是LabelDAOImpl.java。我瞭解到,SELECT *不JPA工作:)

/** 
* {@inheritDoc} 
*/ 
@Override 
public List<Label> getAllLabels() throws Exception { 
    TypedQuery<Label> typedQuery = em.createQuery(
      "SELECT x FROM Label x", Label.class); 
    return typedQuery.getResultList(); 
} 
0

如果您使用的彈簧,確保你有你的應用程序上下文妥善解決。就像爲測試激活適當的彈簧配置文件。 那對我有用