2010-03-21 91 views
1

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

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和@Inject的PersonDaoImpl到的TestCase的PersonDao的?

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

回答

5

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

我实在不明白什么簧片与此有关。我不同意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

+0

至于JPA是否杀死了DAO,这取决于。在某些情况下,您希望重构JPA代码,以便您可以在其他位置重用该代码。那么什么是比DAO更好的地方? – BalusC 2010-03-21 18:03:15

+0

@BalusC我不同意“系统使用DAO”,我同意“这取决于”,但......但并不完全是因为你给的原因(我不是说你错了,但我希望看到你的例子的一个具体的例子,我在想象它时遇到了一些困难)。 – 2010-03-21 18:15:19

+0

还没有,我还没有在真实世界的项目中使用过JPA,只是嘲笑它而已。但我可以想象,无论何时您需要重复相同的一组JPA代码行,如果您的代码行数超过3〜5行,您都希望将其重构,而且我还无法想象“正确”放置这些行。是DAO类吗? – BalusC 2010-03-21 18:21:49

-1

您也可以添加方法PersonDaoImpl.setEntityManager(EntityManager em),然后将其设置为Persistence.createEntityManagerFactory("test").createEntityManager()。 这与Java EE容器没有任何关系。