Wie man richtig eingebettet OpenEJB Behälter für Tests konfigurieren?
Frage
Das ist mein SLSB:
@Stateless
public class MyService {
PersistenceContext(unitName = "abc")
EntityManager em;
public boolean exists(int id) {
return this.em.find(Employee.class, id) != null;
}
}
Das ist mein persistence.xml
(ich bin mit Glassfish v3):
<persistence>
<persistence-unit name="abc">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/MyDS</jta-data-source>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLInnoDBDialect" />
</properties>
</persistence-unit>
</persistence>
Jetzt versuche ich, einen Test zu erstellen, OpenEJB eingebettete Behälter verwenden. Dies ist mein Test-Klasse:
class MyServiceText {
@Test
public void testChecksExistence() throws Exception {
Properties properties = new Properties();
properties.setProperty(
javax.naming.Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory"
);
InitialContext ic = new InitialContext(properties);
// actual testing skipped
}
}
Ich möchte HSQL verwenden, um zu testen. Wie kann ich anweisen OpenEJB, dass meine Persistenzeinheit "abc"
während des Tests zu HSQL-zu-Punkt hat? Soll ich eine neue Version von persistence.xml
erstellen? Soll ich openejb.xml
benutzen? Ich bin in den Beispielen und Dokumentation verloren ..: (
Es ist ein Maven-3-Projekt.
Lösung
Ich würde vorschlagen, eine Datei mit dem Namen jndi.properties
in src/test/resources
für Ihre OpenEJB Konfiguration platzieren. Dies wird dann im Test Classpath verfügbar sein, können Sie dann das nicht-Argument contructor von Initialdatenquellen und EJBs zum Nachschlagen verwenden können. Eine Beispielkonfiguration sieht wie folgt aus, ich bin mit MySQL für meine Datenquelle:
java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
myDS=new://Resource?type=DataSource
myDS.JdbcDriver=com.mysql.jdbc.Driver
myDS.JdbcUrl=jdbc:mysql://127.0.0.1:3306/test
myDS.JtaManaged=true
myDS.DefaultAutoCommit=false
myDS.UserName=root
myDS.Password=root
OpenEJB sollte dann automatisch die Referenz in persistence.xml mit dieser Datenquelle ersetzen, wenn dies die einzige Datenquelle, dann sollte dies funktionieren, auch wenn die Namen unterschiedlich sind.
Edit: Persistenzeinheit Einstellungen
Nach der Dokumentation referenzierten Sie soll es auch sein, möglich configure Persistenzeinheit Eigenschaften durch jndi.properties:
abc.hibernate.hbm2ddl.auto=update
abc.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Ich habe das selbst nicht getestet, da ich mysql bin mit den beiden für Tests und normalen Ausführungen, nur mit anderen Datenbanknamen. Bitte lassen Sie mich wissen, ob das funktioniert, ich Denken bin über zu mysql in meinem Testfall zu ersetzen.