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