2010-10-28 18 views
5

Das ist mein SLSB:Wie konfiguriere ich einen eingebetteten OpenEJB-Container für Tests richtig?

@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> 

nun einen Test zu erstellen Ich versuche, OpenEJB eingebettet Behälter verwenden. Das ist meine Testklasse:

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 zum Testen verwenden. Wie kann ich OpenEJB anweisen, dass meine Persistenzeinheit "abc" während des Testens auf HSQL zeigen muss? Soll ich eine neue Version von persistence.xml erstellen? Soll ich openejb.xml verwenden? Ich bin in ihren examples and documentation verloren .. :(

Es ist ein Maven-3-Projekt.

Antwort

6

würde ich vorschlagen, eine Datei jndi.properties in src/test/resources für Ihre OpenEJB Konfiguration mit dem Namen platzieren. Dies wird dann im Test Classpath verfügbar sein verwenden, können Sie dann die nicht-Argument contructor von Initialdatenquellen und EJBs Lookup 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 ersetzen automatisch die Referenz in Persistenz .xml mit dieser Datenquelle, wenn dies der Fall ist die einzige Datenquelle, dann sollte dies auch funktionieren, wenn die Namen unterschiedlich sind.

Edit: Persistenzeinheit Einstellungen

der documentation you referenced Nach sollte es auch möglich sein, Persistenzeinheit Eigenschaften durch jndi.properties zu konfigurieren:

abc.hibernate.hbm2ddl.auto=update 
abc.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect 

Ich habe dies selbst, da ich nicht getestet verwende mysql sowohl für Tests als auch für normale Ausführungen, nur mit verschiedenen Datenbanknamen. Bitte lassen Sie mich wissen, wenn das funktioniert, habe ich darüber nachgedacht, mysql in meinen Testfällen zu ersetzen.

+0

Vielen Dank, könnten Sie bitte in Ihrer Antwort angeben, wie kann ich Hibernate-Eigenschaften für diese Datenquelle (oder Persistenzeinheit) konfigurieren .. Oder vielleicht können Sie einen Link geben, wo diese Informationen veröffentlicht werden? – yegor256

+0

@Vincenzo, ich habe meine Antwort bearbeitet. Bitte lassen Sie mich wissen, ob das funktioniert. –

+0

örn Vielen Dank, jetzt klappt es! – yegor256