2010-03-21 151 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容器沒有任何關係。