[英]Why EntityManager is not injected?
這是我要測試的課程:
@Stateless
public class Finder {
@PersistenceContext(unitName = "abc")
EntityManager em;
public String read(int i) {
return this.em.find(Employee.class, i).getName();
}
}
這是單元測試:
public class FinderTest {
@Test public void testReadingWorks() {
Finder f = new Finder();
String name = f.find(1);
assert(name.length() > 0);
}
}
問題是EntityManager沒有注入,並且在測試期間是NULL
。 我究竟做錯了什么?
PS。 實際上,我不明白誰將要注入EntityManager。 單元測試由JUnit在任何容器之外啟動......也許我必須在測試中手動注入em
?
實際上,我不明白誰將要注入EntityManager。 單元測試由JUnit在任何容器之外啟動......也許我必須在測試中手動注入em?
由於你的測試用完容器,沒有人會注入任何東西,你必須手動完成。 這是恕我直言並不是一件壞事,並不難。
這是一個可以擴展以獲取EntityManager
的基類:
public abstract class JpaBaseRolledBackTestCase {
protected static EntityManagerFactory emf;
protected EntityManager em;
@BeforeClass
public static void createEntityManagerFactory() {
emf = Persistence.createEntityManagerFactory("PetstorePu");
}
@AfterClass
public static void closeEntityManagerFactory() {
emf.close();
}
@Before
public void beginTransaction() {
em = emf.createEntityManager();
em.getTransaction().begin();
}
@After
public void rollbackTransaction() {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (em.isOpen()) {
em.close();
}
}
}
另一個選擇是在容器中運行測試,使用EJB 3.1 EJBContainer
API啟動嵌入式容器。 請參閱Arun的TOTD#128:EJBContainer.createEJBContainer:使用GlassFish v3的嵌入式EJB (您需要更多的工作來設置數據源)。
或者你可以使用Arquillian 。 看一下測試JPA 2的完美配方:重新審視一些想法。 我今天早上測試了這種方法,並發現真正的集成測試非常有趣(但是在容器測試中通常較慢,我不會將它們用於所有東西 - 但我開始喜歡Arquillian)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.