Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA实现测试DAO?_Java_Testing_Jpa_Dao_Cdi - Fatal编程技术网

Java 如何使用JPA实现测试DAO?

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

我来自春季夏令营,我不想使用Spring,正在迁移到JavaEE6, 但是我在测试DAO+JPA时遇到了问题,下面是我的简化示例:

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行左右的代码,你就会想把它重构掉,而我还无法想象把这些代码行放在什么地方。是刀类吗?