如何使用JPA实现测试DAO?

sma*_*ufo 1 java testing dao jpa cdi

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

public interface PersonDao
{
  public Person get(long id);
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试文件.

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

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

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

Pas*_*ent 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.