我来自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,而不是我想要的......
答案 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容器无关。