【问题标题】:Errors Running JUnit Test (JPA, Derby, Hibernate, Guice)运行 JUnit 测试时出错(JPA、Derby、Hibernate、Guice)
【发布时间】:2011-10-11 04:40:24
【问题描述】:

我正在尝试为我的 DAO 对象创建 JUnit 测试。 JUnit 直接从 Netbeans 运行。我对这些技术中的一些技术很陌生,因此我花了很多时间来追踪我的错误来自哪里。我的代码和我看到的相应错误是:

2011 年 7 月 22 日晚上 7:09:09 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: 找不到 javadb 客户端 jar 文件,derby jdbc 驱动程序默认不可用。致命的 [DatasourceConnectionProvider] - 找不到数据源:Waylon org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001:连接失败: 套接字类型:IIOP_CLEAR_TEXT;主机名:本地主机;端口: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 用于 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;主机名:本地主机; 端口: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) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 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) 在 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) 在 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) 在 com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(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) 在 org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112) 在 javax.persistence.Persistence.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(Native Method) 在 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) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) 在 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) 在 org.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) 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 在 junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126) 在 org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518) 在 javax.persistence.Persistence.createEntityManagerFactory(未知 来源)在 org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052) 在 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 用于 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;主机名:本地主机; 端口:3700 vmcid:OMG 次要代码:1 完成:否] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 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 更多 sun.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 ) );
    }
}

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java unit-testing jpa guice derby


    【解决方案1】:

    这花了很长时间才弄清楚。我认为这里的总体教训是一次只学习一项新技术。我已经提供了运行 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. 连接字符串的变化(这是指向我设置的内存数据库)。
    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();
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 spring,请确保您的应用程序上下文已正确解析。就像为测试激活适当的弹簧轮廓一样。 这对我有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多