我从春天阵营来了,我不想使用Spring,并正在迁移到JavaEE6, 但我有问题的测试DAO + JPA,这里是我的简单示例:

public interface PersonDao
{
  public Person get(long id);
}

这是一个非常基本的DAO,因为我是从春天来了,我相信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的(就像弹簧一样)。

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);
  }
}

这是我的测试文件。

OK,来这里的问题: 由于JUnit的不理解@ javax.inject.Inject,该PersonDao的将不能够注入,会导致测试失败。

我要如何找到一个测试框架,能够EntityManager的注入到PersonDaoImpl和@Inject的PersonDaoImpl到的TestCase的PersonDao的?

我试过unitils.org,但无法找到这样的样品,它只是直接注入的EntityManagerFactory到TestCast,不是我想要的......

有帮助吗?

解决方案

  

因为我是从春天来了,我相信DAO还是有它的价值,所以我决定增加一个DAO层。

我真的不明白簧片与此有关。我不同意正如我在写前面的回答。对我来说,JPA是DAL(数据访问层),而我没有看到把一个数据访问层的另一个数据访问层之上的点。至少没有系统。但是,我们不要讨论这个问题。

  

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

如果您的DAO就像一个CDI管理的组件管理的bean,那么Java EE容器应能在它注入的EntityManager

有关容器管理对象的单元测试,你不需要任何一种容器。对于集成测试后,您将需要某种形式的容器,就像你的Spring beans,休眠/ JPA实体,会话bean做,CDI管理的Bean或任何其他类型的容器管理的对象。你可以使用EJB3.1 API嵌入在测试中的。也看看的Arquillian

其他提示

您还可以添加方法PersonDaoImpl.setEntityManager(EntityManager em),然后通过Persistence.createEntityManagerFactory("test").createEntityManager()设置。 这没什么用Java EE容器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top