如何使用JPA实现测试DAO?

时间:2010-03-21 13:44:51

标签: java testing jpa dao cdi

我来自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,而不是我想要的......

2 个答案:

答案 0 :(得分:5)

  

因为我来自Spring,我相信DAO仍然有它的价值,所以我决定添加一个DAO层。

我真的没有看到Spring与此有什么关系。我不同意as I wrote in a previous answer。对我来说,JPA是一个DAL(数据访问层),我没有看到将数据访问层置于另一个数据访问层之上的重点。至少不系统。但是我们不讨论这个。

  

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

如果您的DAO是CDI托管bean之类的托管组件,那么Java EE容器应该能够在其中注入EntityManager

对于容器管理对象的单元测试,您不需要任何类型的容器。对于集成测试,您将需要某种容器,就像您对Spring bean,Hibernate / JPA实体,会话bean,CDI托管bean或任何其他类型的容器管理对象一样。你可以use the EJB3.1 embeddable API in your tests。另请查看Arquillian

答案 1 :(得分:-1)

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