1

我来自 Spring 阵营,我不想使用 Spring,并且正在迁移到 JavaEE6,但是我在测试 DAO + JPA 时遇到了问题,这是我的简化示例:

public interface PersonDao
{
  public Person get(long id);
}

这是一个很基础的DAO,因为我是Spring出来的,相信DAO还是有它的价值的,所以决定加一个DAO层。

public class PersonDaoImpl implements PersonDao , Serializable
{
  @PersistenceContext(unitName = "test", type = PersistenceContextType.EXTENDED)
  EntityManager entityManager ;

  public PersonDaoImpl()
  {
  }

  @Override
  public Person get(long id)
  {
    return entityManager .find(Person.class , id);
  }
}

这是一个 JPA 实现的 DAO,我希望 EE 容器或测试容器能够注入 EntityManager(就像 Spring 一样)。

public class PersonDaoImplTest extends TestCase
{
  @Inject 
  protected PersonDao personDao;

  @Override
  protected void setUp() throws Exception
  {
    //personDao = new PersonDaoImpl();
  }

  public void testGet()
  {
    System.out.println("personDao = " + personDao); // NULL !
    Person p = personDao.get(1L);
    System.out.println("p = " + p);
  }
}

这是我的测试文件。

好的,问题来了:因为JUnit不理解@javax.inject.Inject,PersonDao将无法注入,测试将失败。

如何找到能够将 EntityManager 注入 PersonDaoImpl 并将 PersonDaoImpl 注入到 TestCase 的 PersonDao 的测试框架?

我试过 unitils.org ,但找不到这样的样本,它只是直接将 EntityManagerFactory 注入 TestCast ,而不是我想要的......

4

2 回答 2

5

因为我是Spring出来的,相信DAO还是有它的价值的,所以决定加一个DAO层。

我真的不明白 Spring 与此有什么关系。而且我不同意我在之前的回答中所写的。对我来说,JPA 是一个 DAL(数据访问层),我看不出将数据访问层置于另一个数据访问层之上的意义。至少不是系统的。但是我们不要讨论这个。

这是一个 JPA 实现的 DAO,我希望 EE 容器或测试容器能够注入 EntityManager(就像 Spring 一样)。

如果您的 DAO 是像 CDI 托管 bean 这样的托管组件,那么 Java EE 容器应该能够在EntityManager其中注入一个。

对于容器管理对象的单元测试,您不需要任何类型的容器。对于集成测试,您将需要某种容器,就像您对 Spring bean、Hibernate/JPA 实体、会话 bean、CDI 托管 bean 或任何其他类型的容器托管对象所做的那样。您可以在测试中使用 EJB3.1 可嵌入 API。也看看Arquillian

于 2010-03-21T17:07:10.513 回答
-1

您也可以添加方法PersonDaoImpl.setEntityManager(EntityManager em),然后设置它Persistence.createEntityManagerFactory("test").createEntityManager()。这与 Java EE 容器无关。

于 2010-04-06T14:23:31.990 回答