Как проверить DAO с реализацией JPA? - PullRequest
1 голос
/ 21 марта 2010

Я пришел из лагеря Spring, я не хочу использовать Spring и перехожу на JavaEE6, но у меня проблемы с тестированием DAO + JPA, вот мой упрощенный пример:

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

Это DAO, реализованный в JPA, я надеюсь, что 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, а не то, что мне нужно ...

Ответы [ 2 ]

5 голосов
/ 21 марта 2010

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

Я не очень понимаю, что Spring имеет к этому отношениеэтот.И я не согласен , как я написал в предыдущем ответе .Для меня JPA - это DAL (уровень доступа к данным), и я не вижу смысла помещать уровень доступа к данным поверх другого уровня доступа к данным.По крайней мере, не систематически.Но давайте не будем это обсуждать.

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

Если ваш DAO является управляемым компонентом, подобным управляемому компоненту CDI, то контейнер Java EE должен быть в состоянии вставить в него EntityManager.

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

0 голосов
/ 06 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...