[英]Unit Testing database layer DAO with derby in memory
我想用此單元測試我的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
正在工作,結果是該測試通過了。 但是在testPersistExcursion
我遇到了NullPointerException
錯誤,因為在setUp
我得到了:
java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
我只是想將EntityManager
添加為全局對象並在setUp
初始化,因此不需要在每個單元測試中都再次編寫這些行(我在某些文章中看到過,並且我認為這是一個很好的方法)。 但是,這有什么問題呢? 為什么在單元測試工作,但在setUp
我找不到驅動程序? 謝謝
編輯:
我發現了問題,那是行家。 我有錯誤的artifactId。 但是現在我在這一行emFactory = Persistence.createEntityManagerFactory("TestingDB");
了"Unable to build EntityManagerFactory"
的問題: emFactory = Persistence.createEntityManagerFactory("TestingDB");
我的持久性單元:
<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();
}
}
}
一切都更好!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.