Ошибки при выполнении теста JUnit (JPA, Derby, Hibernate, Guice)

Я пытаюсь создать тест JUnit для своего объекта DAO. JUnit запускается непосредственно из Netbeans. Я новичок в некоторых из этих технологий, и в результате у меня есть чертовски много времени, чтобы отследить, откуда берутся мои ошибки. Мой код и соответствующая ошибка, которую я вижу:

постоянство.xml

Мой DAO на тестировании:

<?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
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();
        }
    }
}
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>

Мой тест JUnit:

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();
        }
    }
}

Любая помощь будет принята с благодарностью. Спасибо.

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 ) );
    }
}

В этом нужно было долго разбираться. Я думаю, что общий урок здесь состоит в том, чтобы изучать только одну новую технологию за раз. Я предоставил серию шагов, которые я предпринял, чтобы запустить свои JUnits, но в целом это было несколько ошибок, которые были устранены RTFM.


person scubadev    schedule 22.07.2011    source источник


Ответы (2)


Надо отдать должное, эти ресурсы очень помогли.

Я начал с воссоздания моей службы базы данных, используя первый ресурс. Это включало воссоздание каждой таблицы и восстановление зависимостей внешнего ключа (раздражает, но необходимо).

  1. http://platform.netbeans.org/tutorials/nbm-crud.html
  2. Eclipslink – неизвестный тип объекта
  3. Изменение в

Затем я последовал второму руководству, чтобы netbeans автоматически генерировал Entity из моей таблицы базы данных. Моя сущность не требовала изменений, но это заставило 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
/**
 * {@inheritDoc}
 */
@Override
public List<Label> getAllLabels() throws Exception {
    TypedQuery<Label> typedQuery = em.createQuery(
            "SELECT x FROM Label x", Label.class );
    return typedQuery.getResultList();
}
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>

Наконец-то мой юнит-тест запустился, ура! В завершение скажу, что в моем производственном коде были ошибки (потому что я новичок в JPA). Я внес изменения в LabelDAOImpl.java. Я узнал, что SELECT * не работает в JPA :)

  1. Изменение в строке подключения (это указывает на настройку БД в памяти).
  2. Установка свойства генерации ddl на «удаление и создание таблиц».
  3. Если вы используете spring, убедитесь, что контекст вашего приложения разрешен правильно. Например, активируйте соответствующий профиль пружины для теста. Это сработало для меня

http://blogs.oracle.com/geertjan/entry/embedded_database_for_netbeans_platform

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

22 июля 2011 г. 19:09:09 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: не удается найти файл jar клиента javadb, драйвер derby jdbc недоступен по умолчанию. FATAL [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) на солнце .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.conn ection.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(Ejb3C onfiguration.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(собственный метод) в 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.createEntityM anagerFactory (неизвестный источник) в 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 завершено: нет] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at com.sun.enterprise.naming.impl.SerialContext.getProvider (SerialContext.java:352) at 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)

person Tunde Pizzle    schedule 23.11.2016