2010-03-21 4 views
1

Я приехал из Весны лагеря, я не хочу использовать Spring, и я мигрируют в JavaEE6, Но у меня есть проблемы тестирования DAO + JPA, вот мой упрощенный пример:Как проверить 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 (точно так же, как 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 в PersonDao из TestCase?

Я попытался unitils.org, но не могу найти пример, как это, он просто непосредственно впрыскивать EntityManagerFactory к TestCast, а не то, что я хочу ...

ответ

5

, потому что я пришел с весны, я считаю DAO все еще имеет свою ценность, поэтому я решил добавить слой DAO.

Я действительно не вижу, какая весна имеет к этому отношение. И я не согласен as I wrote in a previous answer. Для меня JPA - это DAL (уровень доступа к данным), и я не вижу смысла устанавливать уровень доступа к данным поверх другого уровня доступа к данным. По крайней мере, систематически. Но давайте не будем обсуждать это.

Это внедренная JPA DAO, я надеюсь, что контейнер EE или тестовый контейнер могут вставлять EntityManager (точно так же, как Spring).

Если DAO является управляемым компонентом, как КДИ управляемый компонент, то контейнер Java EE должен иметь возможность вводить в EntityManager в нем.

Для модульных испытаний объектов, управляемых контейнерами, вам не нужен какой-либо контейнер. Для тестирования интеграции вам понадобится какой-то контейнер, как и для весенних бобах, сущностей Hibernate/JPA, сессионных компонентов, управляемых бинов CDI или любого другого объекта, управляемого контейнером. Вы могли бы use the EJB3.1 embeddable API in your tests. Также взгляните на Arquillian.

+0

Что касается того, что JPA убил DAO, это зависит. В некоторых случаях вы хотите где-то рефакторировать код JPA, чтобы вы могли его повторно использовать где-то еще. Что тогда лучше, чем DAO? – BalusC

+0

@BalusC Я не согласен с «использованием DAO систематически», я согласен с «все зависит», хотя ...но не совсем по той причине, которую вы дали (я не говорю, что вы не правы, но я хотел бы увидеть конкретную иллюстрацию вашего примера, у меня есть некоторые трудности при визуализации). –

+0

Пока нет, я еще не использовал JPA в проектах реального мира, просто занимаясь этим. Но я могу себе представить, что всякий раз, когда вам нужно повторять одну и ту же цепочку строк кода JPA, вы хотите отредактировать это, если она вырастет более чем на 3 ~ 5 строк кода или около того, и я пока не могу представить, место для размещения этих строк. Является ли это классом DAO? – BalusC

-1

Вы также можете добавить метод PersonDaoImpl.setEntityManager(EntityManager em), а затем установить его Persistence.createEntityManagerFactory("test").createEntityManager(). Ничего с контейнером Java EE.