Warum wird EntityManager nicht injiziert?

8

Dies ist die Klasse, die ich testen möchte:

%Vor%

Dies ist der Komponententest:

%Vor%

Das Problem besteht darin, dass EntityManager nicht injiziert wird und während des Tests NULL ist. Was mache ich falsch?

ps. Eigentlich verstehe ich nicht wer genau EntityManager injizieren wird. Der Komponententest wird von JUnit außerhalb eines Containers gestartet ... Vielleicht muss ich em manuell in den Test injizieren?

    
yegor256 05.10.2010, 09:06
quelle

2 Antworten

10

Die Injektion von EntityManagers funktioniert nur in verwalteten Beans, da Sie den Finder mit new erstellen, an dem kein Container beteiligt ist. Sie könnten entweder den EntityManager selbst mit der EntityManagerFactory erstellen oder einen einbettbaren Container wie OpenEJB in Ihren Unit-Tests .

    
Jörn Horstmann 05.10.2010, 09:25
quelle
6
  

Eigentlich verstehe ich nicht, wer genau EntityManager injizieren wird. Der Komponententest wird von JUnit außerhalb eines Containers gestartet ... Vielleicht muss ich ihn manuell in den Test injizieren?

Da Ihr Test Container ausläuft, wird niemand etwas spritzen, Sie müssen es manuell tun. Das ist IMHO nicht wirklich eine schlechte Sache und nicht schwer.

Out-Container

Hier ist eine Basisklasse, die Sie erweitern können, um ein EntityManager zu erhalten:

%Vor%

In Container mit der EJBContainer-API

Eine andere Option wäre, Ihren Test in Container auszuführen, indem Sie das EJB 3.1 verwenden EJBContainer API zum Starten eines eingebetteten Containers. Siehe Aruns TOTD # 128: EJBContainer.createEJBContainer: Embedded EJB verwendet GlassFish v3 (Sie benötigen etwas mehr Arbeit, um die Datenquelle einzurichten).

Im Container mit Arquillian

Oder Sie könnten Arquillian verwenden. Schauen Sie sich The perfect an Rezept für das Testen von JPA 2: erneut besucht für einige Ideen. Ich habe diesen Ansatz heute Morgen getestet und finde es SEHR interessant für echte Integrationstests (aber in Containertests sind sie normalerweise langsamer und ich werde sie nicht für alles verwenden - aber ich liebe Arquillian).

    
Pascal Thivent 05.10.2010 10:10
quelle

Tags und Links