Как правильно настроить встроенный OpenEJB-контейнер для тестов? - PullRequest
5 голосов
/ 28 октября 2010

Это мой SLSB:

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

Это мой persistence.xml (я использую 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>

Сейчас я пытаюсь создать тест, используя встроенный контейнер OpenEJB. Это мой тестовый класс:

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

Я бы хотел использовать HSQL для тестирования. Как я могу указать OpenEJB, что мой модуль персистентности "abc" должен указывать на HSQL во время тестирования? Должен ли я создать новую версию persistence.xml? Должен ли я использовать openejb.xml? Я заблудился в их примерах и документации ..: (

Это проект Maven-3.

1 Ответ

6 голосов
/ 28 октября 2010

Я бы предложил разместить файл с именем jndi.properties в src/test/resources для вашей конфигурации OpenEJB.Затем он будет доступен в тестовом пути к классам, затем вы можете использовать конструктор без аргументов InitialContext для поиска источников данных и ejbs.Пример конфигурации выглядит следующим образом: я использую mysql для своего источника данных:

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 должен автоматически заменить ссылку в persistence.xml на этот источник данных, если это единственный источник данных, то это должно работатьдаже если имена разные.

Редактировать: Настройки единиц сохраняемости

В соответствии с документацией , на которую вы ссылались , также должна быть возможность настроить постоянствосвойства модуля через jndi.properties:

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

Я сам не проверял это, так как использую mysql как для тестов, так и для нормального выполнения, только с разными именами баз данных.Пожалуйста, дайте мне знать, если это работает, я думал о замене mysql в моих тестовых случаях.

...