簡體   English   中英

為什么不注入EntityManager?

[英]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

EntityManagers的注入僅適用於托管bean,因為您創建的Finder包含new無容器。 您可以使用EntityManagerFactory自己創建EntityManager,或在單元測試中使用OpenEJB之類的可嵌入容器。

實際上,我不明白誰將要注入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();
        }
    }

}

在容器中使用EJBContainer API

另一個選擇是在容器中運行測試,使用EJB 3.1 EJBContainer API啟動嵌入式容器。 請參閱Arun的TOTD#128:EJBContainer.createEJBContainer:使用GlassFish v3的嵌入式EJB (您需要更多的工作來設置數據源)。

在使用Arquillian的容器中

或者你可以使用Arquillian 看一下測試JPA 2的完美配方:重新審視一些想法。 我今天早上測試了這種方法,並發現真正的集成測試非常有趣(但是在容器測試中通常較慢,我不會將它們用於所有東西 - 但我開始喜歡Arquillian)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM