Java 在内存中使用derby对数据库层DAO进行单元测试

Java 在内存中使用derby对数据库层DAO进行单元测试,java,hibernate,unit-testing,dao,derby,Java,Hibernate,Unit Testing,Dao,Derby,我想用以下方法对我的DAO实现进行单元测试: public class BaseDAOImplTest { private EntityManagerFactory emFactory; private EntityManager em; private static Logger logger = Logger.getLogger(BaseDAOImplTest.class .getName()); @Before publi

我想用以下方法对我的DAO实现进行单元测试:

public class BaseDAOImplTest {

    private EntityManagerFactory emFactory;
    private EntityManager em;
    private static Logger logger = Logger.getLogger(BaseDAOImplTest.class
            .getName());

    @Before
    public void setUp() throws SQLException, ClassNotFoundException {

        logger.info("Starting in-memory database for unit tests");

        try {

            //Creating testDB database
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            DriverManager.getConnection("jdbc:derby:memory:TestingDB;create=true");
            logger.info("Building JPA EntityManager for unit tests");

            //Creating Entity Manager
            emFactory = Persistence.createEntityManagerFactory("TestingDB");
            em = emFactory.createEntityManager();
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        }
    }

    @Test
    public void testPersistExcursion() {
        BaseDAOImpl baseDao = new BaseDAOImpl(Excursion.class, em);
        Calendar c = Calendar.getInstance();
        c.set(2013, 8, 24);
        Excursion ex1 = createExcursion(c.getTime(), 10, "Simple excursion 1", "New York", 35);
        ex1 = baseDao.persist(ex1);
        assertEquals(baseDao.findById(ex1.getId()), ex1);
    }

    @Test
    public void testPersist() {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            String dbURL = "jdbc:derby:memory:TestingDB;create=true";
            Connection conn = getConnection(dbURL);
            EntityManagerFactory f = Persistence.createEntityManagerFactory("TestingDB");
            EntityManager em = f.createEntityManager();
            BaseDAOImpl b = new BaseDAOImpl(Excursion.class, em);
            Calendar c = Calendar.getInstance();
            c.set(2013, 8, 24);
            Excursion ex1 = createExcursion(c.getTime(), 10, "Simple excursion 1", "New York", 35);
            ex1 = b.persist(ex1);
            assertEquals(b.findById(ex1.getId()), ex1);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(BaseDAOImplTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
testPersist正在工作,结果是该测试通过。但是在TestPersistionException中,我得到了NullPointerException错误,因为在安装时我得到:

我只是想将EntityManager添加为全局并在安装程序中初始化,这样我就不需要在每一个单元测试中再次编写这些行了,我在一些文章中看到了这些行,我认为这是一个很好的方法。但这有什么问题?为什么它在单元测试中工作,但在设置中我找不到那个驱动程序?谢谢

编辑:

我发现问题出在maven身上。我弄错了。但现在我遇到了无法在此行构建EntityManagerFactory的问题:emFactory=Persistence.createEntityManagerFactoryTestingDB

我的持久性单位:

<persistence-unit name="TestingDB" transaction-type="RESOURCE_LOCAL">
    <class>cz.infi.javatravelagency.entities.Reservation</class>
    <class>cz.infi.javatravelagency.entities.Trip</class>
    <class>cz.infi.javatravelagency.entities.Customer</class>
    <class>cz.infi.javatravelagency.entities.Excursion</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.connection.username" value="APP"/>
      <property name="hibernate.connection.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="hibernate.connection.password" value="APP"/>
      <property name="hibernate.connection.url" value="jdbc:derby:memory:TestingDB;create=true"/>
      <property name="hibernate.connection.autoReconnect" value="true" />  
      <property name="hibernate.connection.autoReconnectForPools" value="true" />  
      <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />  
    </properties>
  </persistence-unit>

好的,在我的评论之后,我已经尝试了这个方法,它的效果和预期的一样。运行测试时,src/test/resources/META-INF中特定于测试的persistence.xml将按预期拾取

然后,您可以创建一个BaseDao类,其长度如下所示:

public class BaseDao {

    private static EntityManagerFactory emf;

    public static EntityManager getEntityManager() {

        if (emf == null) {

            emf = Persistence.createEntityManagerFactory("test");
        }

        return emf.createEntityManager();
    }
}
}


这真是太好了

您的应用程序非测试数据源是如何配置的?通过persistence.xml?我认为可以在src/test/resources下创建另一个persistence.xml…请参见此处的示例。我假设您没有使用Spring,它提供了一些进一步的选择。是的,通过持久性,我没有使用Spring,因为它将出现在下一个里程碑中。我把这当作家庭作业来做。我会看那篇文章的,谢谢。如果你正在使用Maven,你可以查看我对这篇文章的回答,然后使用derby Maven插件:。
public class BaseDao {

    private static EntityManagerFactory emf;

    public static EntityManager getEntityManager() {

        if (emf == null) {

            emf = Persistence.createEntityManagerFactory("test");
        }

        return emf.createEntityManager();
    }
}