2010-09-27 27 views
8

Ésta es mi clase de Java:Cómo inyectar PersistenceContext durante la prueba unitaria?

public class Finder { 
    @PersistenceContext(unitName = "abc") 
    EntityManager em; 
    public boolean exists(int i) { 
    return (this.em.find(Employee.class, i) != null); 
    } 
} 

Ésta es la prueba de la unidad:

public class FinderTest { 
    @Test public void testSimple() { 
    Finder f = new Finder(); 
    assert(f.exists(1) == true); 
    } 
} 

Prueba falla con NullPointerException desde Finder.em no se inyecta por cualquier persona. ¿Cómo debo manejar esta situación correctamente? ¿Existe alguna mejor práctica?

Respuesta

7

Sin un contenedor como Spring (o algo así como Unitils - basado en Spring), deberá inyectar manualmente el administrador de entidades. En ese caso, usted podría usar algo como esto como clase base:

public abstract class JpaBaseRolledBackTestCase { 
    protected static EntityManagerFactory emf; 

    protected EntityManager em; 

    @BeforeClass 
    public static void createEntityManagerFactory() { 
     emf = Persistence.createEntityManagerFactory("PetstorePu"); 
    } 

    @AfterClass 
    public static void closeEntityManagerFactory() { 
     emf.close(); 
    } 

    @Before 
    public void beginTransaction() { 
     em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
    } 

    @After 
    public void rollbackTransaction() { 
     if (em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 

     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 
3

Depende de qué desea probar. Cuando tiene una lógica comercial compleja en su clase Finder, puede simular el EntityManager - utilizando un marco de burla como EasyMock o Mockito - para probar esa lógica por unidades.

Ahora bien, puesto que no es el caso sospecho que desea probar la persistencia de la entidad Employee (esto se refiere a menudo como pruebas de integración). Esto requiere el uso de una base de datos. Para facilitar las pruebas y mantener sus pruebas portátiles, puede utilizar una base de datos en memoria como HSQLDB para este fin. Para iniciar HSQLDB, cree un contexto de persistencia e inyecte este contexto en su clase de Finder, es aconsejable usar un marco de IoC como Spring.

Hay muchos tutoriales en Internet que explican cómo usar JPA/Spring/HSQLDB. Eche un vistazo a este proyecto de ejemplo: Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB

+0

que tengo que hacer esta inyección "manualmente" en cada unidad de prueba, ¿verdad? – yegor256

+0

No Spring puede analizar la anotación @PersistenceContext e insertarla en su clase Finder. Solo tiene que referirse a ApplicationContext desde FinderTest. –

Cuestiones relacionadas