繁体   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