Я приехал из Весны лагеря, я не хочу использовать 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, а не то, что я хочу ...
Что касается того, что JPA убил DAO, это зависит. В некоторых случаях вы хотите где-то рефакторировать код JPA, чтобы вы могли его повторно использовать где-то еще. Что тогда лучше, чем DAO? – BalusC
@BalusC Я не согласен с «использованием DAO систематически», я согласен с «все зависит», хотя ...но не совсем по той причине, которую вы дали (я не говорю, что вы не правы, но я хотел бы увидеть конкретную иллюстрацию вашего примера, у меня есть некоторые трудности при визуализации). –
Пока нет, я еще не использовал JPA в проектах реального мира, просто занимаясь этим. Но я могу себе представить, что всякий раз, когда вам нужно повторять одну и ту же цепочку строк кода JPA, вы хотите отредактировать это, если она вырастет более чем на 3 ~ 5 строк кода или около того, и я пока не могу представить, место для размещения этих строк. Является ли это классом DAO? – BalusC