Лучшая практика для получения EntityManger для тестирования или производства - PullRequest
0 голосов
/ 14 февраля 2011

Я создаю приложение на основе JPA, и мне нужен EntityManger во многих разных местах. Итак, я создаю одноэлементный класс, который возвращает менеджер сущностей:

class MyDB {
    static EntityManger getEM() {
        ...
    }
}

Я хотел бы использовать это как для тестирования, так и для производственной среды. Для тестирования я хотел бы добавить метод setTestEnvironment (), который обеспечивает использование базы данных TEST. (Это должно быть вызвано до первого вызова getEM ()).

Как лучше всего выбрать рабочую базу данных или тестовую базу данных. Могу ли я добавить несколько единиц постоянства в файл persistence.xml? Какие есть другие альтернативы?

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Если вы работаете на сервере приложений - или даже в контейнере сервлетов, таком как Tomcat, - вы можете просто обрабатывать детали подключения через контейнер.

В Tomcat вы указываете это в XML-файле контекста.веб-приложения и используйте полное имя JNDI ресурса в постоянном XML.

1 голос
/ 14 февраля 2011

Мы используем Spring, и это упрощает работу с аннотацией @PersistenceContext, которая может по выбору принимать тот же самый блок постоянства в persistence.xml, а также предоставляет хорошие тестовые среды, такие как JUnit.

@PersistenceContext
public EntityManager entityManager;

Синглтоны, как известно, сложно тестировать (вам придется добавить такие вещи, как setForTest () и resetForTest ()), также известные как singletonitus . Тратя время на использование контейнера IoC (весной или в Google), вы значительно упрощаете рефакторинг, тестирование и расширение кода.

0 голосов
/ 15 февраля 2011

В конце, как указано в моем первоначальном вопросе, я создал отдельный (одноэлементный) класс, который может быть вызван первым для установки правильной базы данных:

public static void setEnvironment(ApplicationEnvironment env) {
    environment = env;
}

public enum ApplicationEnvironment {
    UNKNOWN, PRODUCTION, TEST, DEVELOPMENT
}

В зависимости от заданной средыединица постоянства выбрана:

    Persistence.createEntityManagerFactory(getEMFactoryParameter());
    ...

    public String getEMFactoryParameter() {

      if(environment == ApplicationEnvironment.DEVELOPMENT) {
        return "mydb_dev";
      } else if(environment == ApplicationEnvironment.TEST) {
        return "mydb_test";
      } else {
        return "mydb_prod";
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...