Comment configurer conteneur OpenEJB intégré pour les tests correctement?
Question
Ceci est mon SLSB:
@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 tester. Comment puis-je Instruire OpenEJB que mon unité de persistance "abc"
doit pointer vers HSQL au cours des essais? Dois-je créer une nouvelle version de persistence.xml
? Dois-je utiliser openejb.xml
? Je suis perdu dans leurs exemples et la documentation ..: (
Il est un projet Maven-3.
La solution
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 de test, vous pouvez alors utiliser le contructor sans argument de InitialContext pour rechercher et sources de données EJB. Un exemple de configuration ressemble à ceci, j'utilise MySQL pour mon source de données:
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 en persistence.xml avec cette source de données, si cela est la seule source de données alors que cela devrait fonctionner même si les noms sont différents.
Edit: Paramètres de l'unité sur la persistance
Selon le documentation vous avez fait référence il devrait également être possible de configurer la persistance des propriétés de l'unité par jndi.properties:
abc.hibernate.hbm2ddl.auto=update
abc.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Je n'ai pas testé moi-même depuis que je suis en utilisant MySQL pour les tests et les exécutions normales, uniquement avec des noms de bases de données différentes. S'il vous plaît laissez-moi savoir si cela fonctionne, j'ai pensé à remplacer mysql dans mes testcases aussi.