Тестирование JPA локально вне контейнера - PullRequest
0 голосов
/ 25 марта 2019

Сейчас я нахожусь в процессе реструктуризации проекта для использования JPA. Я реализовал JPA в ряде проектов, но проблема, с которой я здесь сталкиваюсь, заключается в интеграционных тестах, которые были разработаны, когда этот проект использовал традиционную JDBC для обработки соединений. Методы, которые у меня есть, в настоящее время внедряют менеджер сущностей при выполнении операций JPA. Мой файл persistence.xml в настоящее время указывает на источник данных JTA, доступ к которому возможен только при развертывании приложения. Для моих интеграционных тестов я хотел бы создать EntityManagerFactory, который использует файл «test-persistence.xml», используя локальный тип транзакции ресурса и пул соединений, чтобы я мог запускать эти интеграционные тесты локально, не развертывая свое приложение. Каков наилучший способ достичь этого? Я провел большое количество исследований по этому вопросу, и я изо всех сил пытаюсь найти правильный способ достижения этой цели. В настоящее время я использую EclipseLink в качестве поставщика JPA. Буду признателен за любую помощь.

Вот пример одного из моих методов JPA:

@Default
@Dependent
public class DefaultLayoutProcedure {

@PersistenceContext(unitName = "DB")
EntityManager em;
public int getDefaultLayout(String selectedSeries, String selectedStyle, String selectedMaterial,
                            String selectedColor, double beltWidthInLinks) throws BpgDataAccessException
{
    List<DefaultLayoutEntity> defaultLayoutEntity = null;
    int defaultLayoutID = 0;
    try
    {
        Query q = em.createNamedStoredProcedureQuery("GetDefaultLayout");
        q.setParameter("p_series", selectedSeries)
                .setParameter("p_style", selectedStyle)
                .setParameter("p_material", selectedMaterial)
                .setParameter("p_color", selectedColor)
                .setParameter("p_width_divisor_in_links", beltWidthInLinks);
        defaultLayoutEntity = (List<DefaultLayoutEntity>) q.getResultList();
        for (int i = 0; i < defaultLayoutEntity.size(); i++)
        {
            defaultLayoutID = defaultLayoutEntity.get(i).getBeltLayoutID();
        }
    } catch (Exception e)
    {
        throw new BpgDataAccessException(e);
    }

    return defaultLayoutID;
}

}

Вот пример файла «test-persistence.xml», который я хотел бы настроить для моих интеграционных тестов:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

<persistence-unit name="DB" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>entity.DefaultLayoutEntity</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
        <property name="javax.persistence.jdbc.url" value="EXAMPLE-URL" />
        <property name="javax.persistence.jdbc.user" value="EXAMPLE-USER" />
        <property name="javax.persistence.jdbc.password" value="EXAMPLE-PASSWORD" />
        <property name="eclipselink.weaving" value="static" />
        <property name="eclipselink.logging.level.cache" value="FINEST" />
        <property name="eclipselink.deploy-on-startup" value="True"></property>
        <property name="eclipselink.jdbc.cache-statements" value="true"/>
        <property name="eclipselink.jdbc.bind-parameters" value="true"/>
        <property name = "eclipselink.jdbc.read-connections.max" value="5"/>
        <property name = "eclipselink.jdbc.read-connections.min" value="1"/>
        <property name = "eclipselink.jdbc.read-connections.initial" value="1"/>
        <property name = "eclipselink.jdbc.read-connections.shared" value="true"/>
        <property name = "eclipselink.jdbc.write-connections.max" value="5"/>
        <property name = "eclipselink.jdbc.write-connections.min" value="1"/>
        <property name = "eclipselink.jdbc.write-connections.initial" value="1"/>
    </properties>
</persistence-unit>

Как мне создать EntityManagerFactory для локального запуска моего интеграционного теста вне контейнера?

...