Как протестировать DAO с помощью реализации JPA?

StackOverflow https://stackoverflow.com/questions/2487275

  •  21-09-2019
  •  | 
  •  

Вопрос

Я пришел из Spring camp, я не хочу использовать 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.Введите, PersonDao не сможет ввести, тест завершится неудачей.

Как мне найти тестовый фреймворк , способный внедрить EntityManager в PersonDaoImpl и @Внедрить PersonDaoImpl в PersonDao тестового набора?

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top