Pregunta

He venido desde el campo de la primavera, no quiero utilizar la primavera, y estoy migrando a JavaEE6, Pero no tengo pruebas problema DAO + JPA, aquí está mi ejemplo simplificado:

public interface PersonDao
{
  public Person get(long id);
}

Este es un DAO muy básico, porque venía de primavera, creo DAO todavía tiene su valor, por lo que decidió añadir una capa 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);
  }
}

Este es un DAO implementado por la APP, espero que el contenedor de EE o el contenedor de prueba capaz de inyectar el EntityManager (al igual que la primavera hace).

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

Este es mi archivo de prueba.

OK, aquí viene el problema: Debido a JUnit no entiende @ javax.inject.Inject, la PersonDao no será capaz de inyectar, la prueba fallará.

¿Cómo puedo encontrar un marco de prueba que pueda inyectar el EntityManager a la PersonDaoImpl y @Inject los PersonDaoImpl a la PersonDao de TestCase?

He intentado unitils.org, pero no puede encontrar una muestra de este tipo, simplemente inyectar directamente el EntityManagerFactory a la TestCast, no lo que yo quiero ...

¿Fue útil?

Solución

  

porque venía de primavera, creo DAO todavía tiene su valor, por lo que decidió añadir una capa DAO.

Realmente no ver lo que la primavera tiene que ver con esto. Y no estoy de acuerdo como he escrito en una respuesta anterior. Para mí, la APP es una DAL (capa de acceso de datos), y no veo el punto de poner una capa de acceso de datos en la parte superior de la otra capa de acceso a datos. Al menos no de forma sistemática. Pero no vamos a discutir esto.

  

Este es un DAO implementado por la APP, espero que el contenedor de EE o el contenedor de prueba capaz de inyectar el EntityManager (al igual que la primavera hace).

Si su DAO es un componente administrado como un bean gestionado CDI, entonces el contenedor Java EE debe ser capaz de inyectar un EntityManager en ella.

prueba de la unidad de objetos gestionados por contenedor, que no es necesario ningún tipo de contenedor. Para pruebas de integración , necesitará algún tipo de recipiente, tal como lo hace para los granos de la primavera, entidades Hibernate / JPA, beans de sesión, CDI frijoles o cualquier otro tipo de objeto gestionado por el contenedor administrado. Se podría utilizar la API integrable EJB3.1 en sus pruebas . También echar un vistazo a Arquillian .

Otros consejos

También puede añadir método PersonDaoImpl.setEntityManager(EntityManager em), a continuación, establecer por Persistence.createEntityManagerFactory("test").createEntityManager(). No es nada con el contenedor Java EE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top