Java 如何使用JPA实现测试DAO?
我来自春季夏令营,我不想使用Spring,正在迁移到JavaEE6, 但是我在测试DAO+JPA时遇到了问题,下面是我的简化示例:Java 如何使用JPA实现测试DAO?,java,testing,jpa,dao,cdi,Java,Testing,Jpa,Dao,Cdi,我来自春季夏令营,我不想使用Spring,正在迁移到JavaEE6, 但是我在测试DAO+JPA时遇到了问题,下面是我的简化示例: public interface PersonDao { public Person get(long id); } 这是一把非常基本的刀,因为我来自Spring,我相信刀仍然有它的价值,所以我决定添加一个刀层 public class PersonDaoImpl implements PersonDao , Serializable { @Persist
public interface PersonDao
{
public Person get(long id);
}
这是一把非常基本的刀,因为我来自Spring,我相信刀仍然有它的价值,所以我决定添加一个刀层
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容器或测试容器能够像Spring一样注入EntityManager
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注入PersondaImpl并@InjectthePersondaImpl注入TestCase的PersonDao的测试框架
我尝试了unitils.org,但找不到这样的示例,它只是直接将EntityManagerFactory注入到TestCast,而不是我想要的
因为我来自春天,我相信刀仍然有它的价值,所以我决定添加一个刀层
我真的不明白春天和这有什么关系。我不同意。对我来说,JPA是一个DAL数据访问层,我不认为把一个数据访问层放在另一个数据访问层之上有什么意义。至少不是系统性的。但我们不要讨论这个
这是一个JPA实现的DAO,我希望EE容器或测试容器能够像Spring一样注入EntityManager
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);
}
}
如果DAO是一个托管组件,比如CDI托管bean,那么JavaEE容器应该能够在其中注入EntityManager
对于容器管理对象的单元测试,您不需要任何类型的容器。对于集成测试,您将需要某种容器,就像您对Springbean、Hibernate/JPA实体、会话bean、CDI管理的bean或任何其他类型的容器管理对象所做的那样。你可以。也来看看
因为我来自春天,我相信刀仍然有它的价值,所以我决定添加一个刀层
我真的不明白春天和这有什么关系。我不同意。对我来说,JPA是一个DAL数据访问层,我不认为把一个数据访问层放在另一个数据访问层之上有什么意义。至少不是系统性的。但我们不要讨论这个
这是一个JPA实现的DAO,我希望EE容器或测试容器能够像Spring一样注入EntityManager
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);
}
}
如果DAO是一个托管组件,比如CDI托管bean,那么JavaEE容器应该能够在其中注入EntityManager
对于容器管理对象的单元测试,您不需要任何类型的容器。对于集成测试,您将需要某种容器,就像您对Springbean、Hibernate/JPA实体、会话bean、CDI管理的bean或任何其他类型的容器管理对象所做的那样。你可以。还可以查看。您还可以添加方法PersonDaoImpl.setEntityManagerEntityManager em,然后通过Persistence.createEntityManager工厂测试.createEntityManager进行设置。
Java EE容器没有任何功能。您还可以添加persondaimpl.setEntityManagerEntityManager em方法,然后通过Persistence.createEntityManager FactoryTest.createEntityManager进行设置。
这与JavaEE容器无关。至于JPA是否杀死了DAO,这要看情况而定。在某些情况下,您可能希望在某个地方重构JPA代码,以便在其他地方重用它。还有什么地方比刀更好?@BalusC我不同意系统地使用刀,但我同意这取决于。。。但不完全是因为你给出的原因,我不是说你错了,但我想看一个你的例子的具体例子,我在可视化方面有一些困难。还没有,我还没有在现实世界的项目中使用JPA,只是胡扯而已。但我可以想象,每当你需要重复相同的JPA代码行时,如果它超过3~5行左右的代码,你就会想把它重构掉,而我还无法想象把这些代码行放在什么地方。是DAO类吗?至于JPA是否杀死了DAO,这取决于。在某些情况下,您可能希望在某个地方重构JPA代码,以便在其他地方重用它。还有什么地方比刀更好?@BalusC我不同意系统地使用刀,但我同意这取决于。。。但不完全是因为你给出的原因,我不是说你错了,但我想看一个你的例子的具体例子,我在可视化方面有一些困难。还没有,我还没有在现实世界的项目中使用JPA,只是胡扯而已。但我可以想象,每当你需要重复相同的JPA代码行时,如果它超过3~5行左右的代码,你就会想把它重构掉,而我还无法想象把这些代码行放在什么地方。是刀类吗?