2010-09-27 11 views
8

Das ist meine Java-Klasse:Wie wird PersistenceContext während des Komponententests injiziert?

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

Dies ist das Gerät zu testen:

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

Testing nicht mit NullPointerException seit Finder.em wird von niemandem injiziert. Wie soll ich mit dieser Situation richtig umgehen? Gibt es Best Practices?

Antwort

7

Ohne einen Container wie Spring (oder etwas wie Unitils - die auf Spring basiert), müssen Sie den Entity Manager manuell injizieren. In diesem Fall Sie könnte Verwendung so etwas wie dies als Basisklasse:

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

Es hängt von was Sie testen möchten. Wenn Sie komplexe Geschäftslogik in Ihrer Finder Klasse haben, können Sie die EntityManager - mit einem spöttischen Framework wie EasyMock oder Mockito - zum Testen dieser Logik versuchen.

Da nun das ist nicht der Fall, dass ich Ihnen die persistency der Employee Einheit testen möchten vermuten (dies oft als Integrationstest bezeichnet wird). Dies erfordert die Verwendung einer Datenbank. Um das Testen zu vereinfachen und Ihre Tests portabel zu halten, können Sie eine In-Memory-Datenbank wie HSQLDB für diesen Zweck verwenden. Um HSQLDB zu starten, einen Persistenzkontext zu erstellen und diesen Kontext in Ihre Finder-Klasse zu injizieren, ist es ratsam, ein IoC-Framework wie Spring zu verwenden.

Es gibt Unmengen von Tutorials im Internet, die erklären, wie man JPA/Spring/HSQLDB benutzt. Werfen Sie einen Blick auf dieses Beispielprojekt: Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB

+0

ich diese Injektion zu tun habe, „von Hand“ in jedem Unit-Test, nicht wahr? – yegor256

+0

Nein Spring kann die @PersistenceContext-Annotation analysieren und in Ihre Finder-Klasse einfügen. Sie müssen nur auf den ApplicationContext von FinderTest verweisen. –

Verwandte Themen