Como configurar o contêiner OpenEJB incorporado para testes corretamente?
Pergunta
Este é o meu SLSB:
@Stateless
public class MyService {
PersistenceContext(unitName = "abc")
EntityManager em;
public boolean exists(int id) {
return this.em.find(Employee.class, id) != null;
}
}
Este é meu persistence.xml
(Estou usando 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>
Agora estou tentando criar um teste, usando o contêiner incorporado OpenEJB. Esta é a minha aula de teste:
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
}
}
Eu gostaria de usar o HSQL para testes. Como posso instruir o OpenEjb que minha unidade de persistência "abc"
Tem que apontar para o HSQL durante o teste? Devo criar uma nova versão de persistence.xml
? Devo usar openejb.xml
? Estou perdido em seus Exemplos e documentação.. :(
É um projeto MAVEN-3.
Solução
Eu sugeriria colocar um arquivo chamado jndi.properties
dentro src/test/resources
Para sua configuração OpenEJB. Isso estará disponível no Test ClassPath, você poderá usar o contrato de nenhum argumento do InitialContext para procurar fontes de dados e EJBs. Um exemplo de configuração se parece com isso, estou usando o MySQL para o meu 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
O OpenEJB deve então substituir automaticamente a referência no persistence.xml por esse conjunto de dados, se esse for o único conjunto de dados, isso deve funcionar mesmo que os nomes sejam diferentes.
Editar: Configurações da unidade de persistência
De acordo com documentação que você referenciou Também deve ser possível configurar as propriedades da unidade de persistência por meio de jndi.properties:
abc.hibernate.hbm2ddl.auto=update
abc.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Eu também não testei isso, pois estou usando o MySQL para testes e execuções normais, apenas com diferentes nomes de banco de dados. Informe -me se isso funciona, eu também tenho pensado em substituir o MySQL nas minhas casas de teste.