2010-10-28 31 views
5

Ceci est mon SLSB:Comment configurer correctement le conteneur OpenEJB intégré pour les tests?

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

Ceci est mon persistence.xml (j'utilise 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> 

Maintenant, je suis en train de créer un test, en utilisant conteneur embarqué OpenEJB. Ceci est ma classe de test:

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

Je voudrais utiliser HSQL pour le test. Comment puis-je demander à OpenEJB que mon unité de persistance "abc" doit pointer vers HSQL pendant le test? Dois-je créer une nouvelle version de persistence.xml? Dois-je utiliser openejb.xml? Je suis perdu dans leur examples and documentation .. :(

C'est un projet Maven-3.

Répondre

6

Je suggère de placer un fichier nommé jndi.properties dans src/test/resources pour votre configuration OpenEJB. Ce sera alors disponible dans le classpath test , vous pouvez alors utiliser le contructor de InitialContext sans argument pour rechercher les sources de données et EJB Un exemple de configuration ressemble à ceci, j'utilise MySQL pour mon dataSource.

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 doit alors remplacer automatiquement la référence dans la persistance .xml avec cette source de données, si c'est la seule source de données alors cela devrait fonctionner même si les noms sont différents.

Edit: réglages de l'appareil sur la persistance

Selon le documentation you referenced il devrait également être possible de configurer les propriétés de l'unité de persistance à travers jndi.properties:

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

Je ne l'ai pas testé moi-même depuis que je J'utilise mysql pour les tests et les exécutions normales, uniquement avec des noms de bases de données différents. S'il vous plaît laissez-moi savoir si cela fonctionne, j'ai pensé à remplacer mysql dans mes testcases aussi.

+0

Merci, pourriez-vous indiquer dans votre réponse comment configurer les propriétés Hibernate pour cette source de données (ou unité de persistance). Ou peut-être pouvez-vous donner un lien où cette information est divulguée? – yegor256

+0

@Vincenzo, j'ai édité ma réponse, s'il vous plaît laissez-moi savoir si cela fonctionne. –

+0

örn Merci beaucoup, maintenant ça marche! – yegor256