2011-08-19 31 views
0

之後找不到PersistenceContext中的實體我正在編寫一個JavaEE項目,並試圖在途中獲取一些單元測試。我們使用的單元測試框架是JUnit,與Maven和Hudson一起用於構建和CI。在.persist()

在其他測試中,我想測試JPA-2.0查詢邏輯,因爲這是我們項目的核心功能之一。我們實現了相當複雜的查詢邏輯,它也允許用戶犯錯誤,錯誤地拼寫等等,所以我們想讓這個工作起作用。

查詢本身是使用JPA-2.0 Criteria API和Metamodel API動態構建的。

現在,在我的單元測試,我設置了持久性和創造這樣一個EntityManager:

protected static EntityManagerFactory emf; 
protected static EntityManager em; 
emf = Persistence.createEntityManagerFactory("persistenceUnitName"); 
em = emf.createEntityManager(); 

這工作,我還可以查詢數據庫 - 但是這不是我想要的。

我想要做的事:
由於我們不希望在DB的測試數據,該計劃是,先創建一些實體,然後堅持他們。然後我們運行我們的查詢並確保我們得到正確的結果。最後,由於單元測試持久性沒有在事務中運行,所以實體永遠不會持久化到DB,並且DB保持不變(這是我們想要的)。

Entity entity = new Entity(); 
entity.setAttribute("stuff"); 
//... 
em.persist(entity); 
// ... 
// Here comes the query which should find above entity with attribute 'stuff'... 

但是。無論我創建並堅持單元測試的實體是而不是都可以從相同的測試(甚至是方法)中找到。我可以成功查詢數據庫並從那裏查找實體,但新持久化的測試用例不在那裏。

我想我誤解了一些關鍵的東西有關JPA持久化上下文 - 我會很高興,如果有人能賜教! :)

在重要的情況下,這就是,這裏是測試中使用的persistence.xml中的樣子:

<persistence-unit name="persistenceUnitName" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <!-- list of classes to manage --> 
    <properties> 
    <!-- driver and connection info, this works--> 
    </properties> 
</persistence-unit> 

回答

1

你有EntityManager.getTransaction()()開始啓動transactiona,然後rollback()將其回滾。或者,也許你可以創建一個單獨的複製的整個數據庫的實例只是爲了測試?只是一個想法。

+0

這似乎是非常有前途的,謝謝。 關於測試DB:這不會真正解決這個問題,因爲我不想要的單元測試取決於其很可能會經常更換一些測試DB條目......因此,我們需要先創建假的條目(使用現實生活中的例子儘可能)和測試那些... – fgysin