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?
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 .
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.
Hier ist eine Basisklasse, die Sie erweitern können, um ein EntityManager
zu erhalten:
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).
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).