0
votes

I'm attempting to create a JUnit test for my DAO object. The JUnit is ran directly from Netbeans. I'm quite new to several of these technologies, and as a result I'm having a heck of a time tracing down where my errors are coming from. My code and the corresponding error that I'm seeing are:

Jul 22, 2011 7:09:09 PM com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default. FATAL [DatasourceConnectionProvider] - Could not find datasource: Waylon org.omg.CORBA.COMM_FAILURE: FINE: IOP00410001: Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 3700 vmcid: OMG minor code: 1 completed: No javax.naming.NamingException: Lookup failed for 'Waylon' in 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} [Root exception is javax.naming.NamingException: Unable to acquire 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} [Root exception is org.omg.CORBA.COMM_FAILURE: FINE: IOP00410001: Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 3700 vmcid: OMG minor code: 1 completed: No]] at sun.reflect.GeneratedConstructorAccessor31.newInstance(Unknown Source) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at 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) at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95) at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387) at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107) at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) at $Proxy40.connectFailure(Unknown Source) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:257) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:270) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:129) at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:223) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126) at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:228) at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) at 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.Persistence.createEntityManagerFactory(Unknown Source) at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69) at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) at com.sun.enterprise.naming.impl.SerialContext$ProviderCacheKey.getNameService(SerialContext.java:1241) at waylon.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java:36) at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:411) at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at javax.naming.InitialContext.lookup(InitialContext.java:392) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) at org.junit.runners.ParentRunner.run(ParentRunner.java:303) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518) at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906) at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) at waylon.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java:36) Caused by: javax.naming.NamingException: Unable to acquire 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} [Root exception is org.omg.CORBA.COMM_FAILURE: FINE: IOP00410001: Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 3700 vmcid: OMG minor code: 1 completed: No] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504) ... 29 more at 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>

My DAO under Test:

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

My JUnit Test:

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

Any help would be greatly appreciated. Thanks.

2

2 Answers

5
votes

This took a long time to figure out. I think the overall lesson here is to learn only one new technology at a time. I've provided the series of steps I took to get my JUnits to run, but overall it was several mistakes that were resolved by RTFM.

To give credit where it is due, these resources helped tremendously.

  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

I started by recreating my database service using the first resource. This involved recreating each table and reestablishing the foreign key dependencies (annoying, but necessary).

I then followed the second tutorial to have netbeans automatically generate an Entity from my database table. My entity required no changes, but this did cause Netbeans to generate a persistence.xml. I compared it against my own, and came up with with this segment:

<?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>

The big changes here are:

  1. The change in
  2. The change in connection string (this is to point to the in memory DB I setup).
  3. Setting the ddl-generation property to "drop-and-create-tables".

Finally, my unit test ran, hooray! Just to round things out, there were errors in my production code (because I'm a total beginner at JPA). The changes I made were to LabelDAOImpl.java. I learned that SELECT * doesn't work in 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
votes

If you are using spring, Make sure you have your application context resolved properly. Like activate appropriate spring profile for the test. That worked for me